【发布时间】:2020-06-03 20:24:20
【问题描述】:
假设设备内存中有一个顶点缓冲区和一个主机连贯且可见的暂存缓冲区。还假设一个带有独立 GPU 的桌面系统(因此独立的内存)。最后,假设正确的帧间同步。
我看到了两种更新顶点缓冲区的通用方法:
Map +
memcpy+ unmap 到暂存缓冲区,然后是包含vkCmdCopyBuffer的临时(单命令)命令缓冲区,将其提交到图形队列并等待队列空闲,然后释放瞬态命令缓冲区。之后像往常一样将常规帧绘制队列提交到图形队列。这是https://vulkan-tutorial.com 上使用的代码(例如this .cpp file)。与上述类似,只是在暂存缓冲区复制提交后使用附加信号量发出信号,并在常规帧绘制提交中等待,从而跳过“等待空闲”命令。
#2 对我来说有点意思,我反复阅读不要在 Vulkan 中执行任何“等待空闲”操作,因为它使 CPU 与 GPU 同步,但我从未见过它用于任何在线教程或示例。如果顶点缓冲区必须相对频繁地更新,专业人士通常会怎么做?
【问题讨论】:
-
"Map + memcpy + unmap 到暂存缓冲区" 不,只有在你要删除它时才取消映射相干内存。多次映射内存是零点。
-
嗯,我实际上是为我每帧更新的缓冲区这样做(保持映射),但保持所有暂存缓冲区也映射是有意义的。
标签: language-agnostic vulkan vertex-buffer