每次缓冲区的内容发生变化时,我是否需要内存映射/取消映射缓冲区



我正在做一个Vulkan项目,它渲染到输出流中,而不是呈现它(没有swapchain等人(:渲染的图像被复制到另一个图像(vkCmdCopyImage(,然后后面的图像被内存映射(vkMapMemory(,数据被复制到其他地方,然后被取消映射(vkUnmapMemory(。每一帧都是这样。是否有一种方法可以映射(第二个(图像一次,进入主循环(在每个循环中渲染一个帧(,然后作为应用程序清理的一部分取消映射?我试过了,但看起来每当有东西被复制到图像中时,早期的映射都不起作用,必须取消映射并重新映射。

在Vulkan中,从来没有必要取消映射已映射的内存。即使删除内存也会隐式地取消映射。

但是,正确同步对该内存的访问是所必需的。为了修改GPU上的图像,使用execution&内存依赖性以确保GPU修改对主机的可用性和可见性,CPU可以等待/测试的事件以确保修改可见,如果内存与主机不一致,则需要调用vkInvalidateMappedMemoryRanges以确保此类更改对主机的可见性。

最新更新