假设在设备内存中有一个顶点缓冲区,在主机上有一个内存一致且可见的分段缓冲区。同样假设使用独立GPU的桌面系统(因此具有单独的内存)。最后,假设帧间同步正确。我看到两种常见的更新顶点缓冲区的方法:
1. 映射+
2. 类似于上述方法,只需使用其他信号量在分段缓冲区复制提交后进行标记,并在常规帧绘制提交中等待,从而跳过“等待空闲”命令。
第二种方法对我来说有点合理,我一再阅读不要在Vulkan中执行任何“等待空闲”操作,因为它会将CPU与GPU同步,但我从未在任何在线教程或示例中看到过它的使用。如果需要相对频繁地更新顶点缓冲区,专家通常会做什么?
1. 映射+
memcpy
+取消映射到分段缓冲区,接下来是一个临时(单个命令)命令缓冲区,其中包含一个vkCmdCopyBuffer
,将其提交给图形队列并等待队列空闲,然后释放临时命令缓冲区。之后像往常一样将常规帧绘制队列提交给图形队列。这是在https://vulkan-tutorial.com上使用的代码(例如这个 .cpp 文件)。2. 类似于上述方法,只需使用其他信号量在分段缓冲区复制提交后进行标记,并在常规帧绘制提交中等待,从而跳过“等待空闲”命令。
第二种方法对我来说有点合理,我一再阅读不要在Vulkan中执行任何“等待空闲”操作,因为它会将CPU与GPU同步,但我从未在任何在线教程或示例中看到过它的使用。如果需要相对频繁地更新顶点缓冲区,专家通常会做什么?