【问题标题】:Do I need to memory map/unmap a buffer every time the content of the buffer changes?每次缓冲区内容更改时,我是否需要内存映射/取消映射缓冲区?
【发布时间】:2020-10-10 17:55:56
【问题描述】:

我正在做一个 Vulkan 项目,它渲染到传出流中而不是呈现它(没有交换链等):渲染的图像被复制到另一个图像(vkCmdCopyImage)然后后面的图像被内存映射(@987654323 @),数据被复制到其他地方然后它被取消映射 (vkUnmapMemory)。这在每一帧都发生。有没有办法将(第二个)图像映射一次,进入主循环(在每个循环中渲染一个帧)然后将其作为应用程序清理的一部分取消映射? 我试过了,但似乎每当将某些内容复制到图像时,早期的映射都不起作用,必须取消映射并再次映射。

【问题讨论】:

标签: vulkan


【解决方案1】:

在 Vulkan 中永远不需要取消映射您已映射的内存,除非您要删除它。

但是, 需要正确同步对该内存的访问。对于在 GPU 上修改图像,使用执行和内存依赖关系来确保 GPU 修改对主机的可用性和可见性,CPU 可以等待/测试的事件以确保修改可见,以及如果内存不是主机-连贯,您需要调用vkInvalidateMappedMemoryRanges 以确保对主机的此类更改可见。

【讨论】:

  • 根据 vkFreeMemory 规范释放内存时,也不需要显式地取消映射内存。但是,是的。对于相反的情况(CPU 写入、GPU 读取),调用非 HOST_COHERENT 内存的相应函数是 vkFlushMappedMemoryRanges(不要忘记将刷新/无效偏移和大小与 nonCoherentAtomSize 对齐)。
  • 另外,如果提交中由 GPU 读取的数据是在调用 vkQueueSubmit 后由 CPU 写入的(如果您明确等待通过 GPU 上的 VkEvent 完成写入),在读取新数据之前等待之后,您需要将范围从 VK_PIPELINE_STAGE_HOST_BIT/VK_ACCESS_HOST_WRITE_BIT 转换 - 这使其 visible 到 GPU(刷新/连贯写入仅使其成为 available)。对于通常的情况(在 vkQueueSubmit 之前写下所有需要的东西),这个屏障是隐含在 vkQueueSubmit 中的,不是必需的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-12
  • 1970-01-01
  • 2015-01-29
  • 1970-01-01
  • 2022-07-15
  • 1970-01-01
相关资源
最近更新 更多