Vulkan中统一缓冲区的最佳实践

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Vulkan中统一缓冲区的最佳实践相关的知识,希望对你有一定的参考价值。

让我先说一下我的统一缓冲方式,我在设备本地存储器中有一个缓冲区,在主机相干存储器中有一个缓冲区(用于分段),每个帧在开始渲染传递之前被分成帧数缓冲区,每帧中,我更新位于其中的主机,然后将其复制到设备位置,我等到命令缓冲区结束。

(假设我的GPU是一个独立的GPU,CPU和GPU之间没有共享内存)

现在我的问题:

  • 它是管理统一缓冲区的最佳方式吗?在每个帧中进行分段和复制?
  • 确实,我知道我使用的同步机制,不行,这样做的最佳方法是什么?
  • 如果你的答案是做屏障同步,那么这样做的确切方法是什么? (因为我没见过这样的样品。)

到这里我看到的每个示例代码,都使用主机相干统一缓冲区,如果您为这样的代码引用示例代码,我将不胜感激。

答案

我很惊讶你有一个没有HOST_VISIBLE堆的设备,可以找到统一缓冲区。使用CPU写入GPU读取的同一个缓冲区通常是最好的路径,我认为所有现代GPU都支持它。

但是如果你真的需要一个主机 - >设备副本,那么你想确保在图形管道准备好使用它们之前尽早启动它们,并使用仅传输队列来完成副本。这将使副本与其他早期工作重叠,因此图形管道永远不会闲置等待它。要做到这一点:

  1. 将帧的制服写入主机缓冲区。
  2. 使用host-> device copy命令将命令缓冲区提交到传输队列,并将VkSemaphore放入VkSubmitInfo::pSignalSemaphores
  3. 完成帧渲染命令缓冲区的所有剩余工作,并使用VkSubmitInfo::pWaitSemaphores列表中的早期信号量将它们提交到图形队列。不幸的是,由于顶点着色器中可能需要一些制服,所以*pWaitDstStageMask需要是VK_PIPELINE_STAGE_VERTEX_SHADER_BIT

如果您受GPU限制,希望在图形管道仍然在帧N上工作时发生帧N + 1的传输。您可能需要像GPUView或Radeon Graphics Profiler这样的工具来查看这是否正确发生。

以上是关于Vulkan中统一缓冲区的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

如何正确调用vulkan.hpp构造函数来获取命令缓冲区?

更新片段参数的最佳实践?

在片段和活动之间进行通信 - 最佳实践

确定协议缓冲区消息类型的最佳实践

android片段-数据传递-最佳实践[重复]

在另一个活动托管的片段之间传递数据的最佳实践