繁体   English   中英

vulkan 中可以接受多少次绘制调用?

[英]How many draw calls is acceptable in vulkan?

我一直在研究 vulkan 渲染器,并且有点不满意。 目前我正在使用 vulkan 来渲染 2d 精灵,并且只是导入了整个地图进行绘制。 地图为 40x40,有 1600 个图块。 我无法实例/批处理这些,因为场景中有移动对象,我可能需要在两者之间插入绘制调用(某些对象需要在其他对象之前渲染)。 但是,当我单独渲染这 1600 个精灵时,我的 cpu CHUGS 需要大约 20 毫秒才能完成精灵。 这发生在一个单独的线程中,并执行以下操作:

Start command buffer & render pass 
 For every sprite to draw
   Set up translation matrix.
   Fetch the material if its not cached
   If this command buffer is not bound to the pipeline bind it.
   Bind the descriptor set given by the material if not already bound.
   Push translation matrix to pipeline using push constant.
   Draw.
End command buffer & render pass & submit.

我想我的问题是,1600 是不是太多了? 我应该尝试找到批量处理的方法吗? 仅花费这些时钟周期在 gpu 上构建一个大缓冲区并且只绘制一次是否更有意义? 我认为这效率较低,因为我只为给定的所有命令提交一次。

是的,这种类型的应用程序的 1600 次绘制调用太多了。 听起来您可以使用单个vkCmdDrawIndexedIndirect()

您只需要为每个精灵矩阵和纹理采样器创建SSBOgl_DrawIDARB在着色器中使用gl_DrawIDARB索引到每个绘制中(不要忘记启用VK_KHR_SHADER_DRAW_PARAMETERS_EXTENSION_NAME )。

每帧 CPU 端的预绘制准备工作包括在VkDrawIndexedIndirectCommand结构中设置正确的顶点/索引缓冲区偏移量,以及设置任何所需的纹理加载和填充描述符。

如果您考虑绘制顺序,您的应用程序可以跟踪每个精灵的深度,然后确保它们以正确的顺序设置为绘制。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM