Vulkan中统一缓冲区的最佳实践
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Vulkan中统一缓冲区的最佳实践相关的知识,希望对你有一定的参考价值。
让我先说一下我的统一缓冲方式,我在设备本地存储器中有一个缓冲区,在主机相干存储器中有一个缓冲区(用于分段),每个帧在开始渲染传递之前被分成帧数缓冲区,每帧中,我更新位于其中的主机,然后将其复制到设备位置,我等到命令缓冲区结束。
(假设我的GPU是一个独立的GPU,CPU和GPU之间没有共享内存)
现在我的问题:
- 它是管理统一缓冲区的最佳方式吗?在每个帧中进行分段和复制?
- 确实,我知道我使用的同步机制,不行,这样做的最佳方法是什么?
- 如果你的答案是做屏障同步,那么这样做的确切方法是什么? (因为我没见过这样的样品。)
到这里我看到的每个示例代码,都使用主机相干统一缓冲区,如果您为这样的代码引用示例代码,我将不胜感激。
答案
我很惊讶你有一个没有HOST_VISIBLE堆的设备,可以找到统一缓冲区。使用CPU写入GPU读取的同一个缓冲区通常是最好的路径,我认为所有现代GPU都支持它。
但是如果你真的需要一个主机 - >设备副本,那么你想确保在图形管道准备好使用它们之前尽早启动它们,并使用仅传输队列来完成副本。这将使副本与其他早期工作重叠,因此图形管道永远不会闲置等待它。要做到这一点:
- 将帧的制服写入主机缓冲区。
- 使用host-> device copy命令将命令缓冲区提交到传输队列,并将
VkSemaphore
放入VkSubmitInfo::pSignalSemaphores
。 - 完成帧渲染命令缓冲区的所有剩余工作,并使用
VkSubmitInfo::pWaitSemaphores
列表中的早期信号量将它们提交到图形队列。不幸的是,由于顶点着色器中可能需要一些制服,所以*pWaitDstStageMask
需要是VK_PIPELINE_STAGE_VERTEX_SHADER_BIT
。
如果您受GPU限制,希望在图形管道仍然在帧N上工作时发生帧N + 1的传输。您可能需要像GPUView或Radeon Graphics Profiler这样的工具来查看这是否正确发生。
以上是关于Vulkan中统一缓冲区的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章