在编写混合图形/计算应用程序时,我试图学习Vulkan(主要从vulkan-tutorial.com学习)(我需要渲染深度缓冲区并对其进行一些计算,没有显示)。我几乎要渲染我的第一个(深度)图像,而我要做的就是弄清楚如何将单个vec4
作为唯一参数传递给我的顶点着色器(除了position属性)。
我读过的所有地方都说推送常数比制服要快,因此它们似乎是我参数的明显选择,但似乎我需要在每个渲染图像上重置命令缓冲区,以便使用{{ 1}},在使用制服的情况下,我可以保持命令缓冲区固定,并在使用vkCmdPushConstants()
提交渲染任务之前,只需更新映射的内存区域(并刷新(如果不一致,则刷新))。
重写整个命令缓冲区真的比映射的内存写入快吗?还是有人说推入参数更快,是否假设将在每个渲染图像上重建命令缓冲区,所以无论如何大部分成本已经支付了?
最后,我可以在另一个较小的,先前提交的命令缓冲区中更新推送常量,并使用信号量与另一个命令缓冲区同步吗? (我想不是,但是就这个问题而言,我尚不清楚常数被推送的有效时间是多少,或者管道保持绑定的时间。)如果可能的话,这是一个好方法吗?
编辑:不可能,这不可能,只是发现here:
每个命令缓冲区独立于其他命令缓冲区来管理状态。
和
当命令缓冲区开始记录时,该命令中的所有状态 缓冲区未定义。
因此,我的问题仍然存在。
答案 0 :(得分:4)
重写整个命令缓冲区真的比映射的内存写入快吗?
这是错误的问题。您没有考虑到实际修改内存以使GPU可以使用它的时间。
好的,因此您已经获得了从某些内存读取制服的命令缓冲区。您想在两个单独的框架中使用它。但是您想在帧之间更改内存。
好吧,直到第一帧读取完毕,您才能写入该内存。因此,您需要CB在上一次读取制服后设置一个事件。在为该帧提交CB之后,您需要在CPU上等待该事件,然后才能写入数据(更不用说提交下一帧的数据了)。
这就是CPU / GPU同步。这对于GPU性能或CPU性能而言不是很好。 GPU可能会耗尽,因为CPU必须执行此类同步,而CPU可能只是坐在那里而无所事事。
重建大多数命令缓冲区是Vulkan应用程序工作的典型方式。