我想使用Vulkan构建一个屏幕外渲染器,并将渲染内容复制到每一帧的主机内存中。
一种方案是使用带有TILING_OPTIMAL的帧图像,并涉及另一种复制渲染过程,以将内容复制到主机可见的登台缓冲区。
另一种方案是使用带有TILING_LINEAR的帧图像,然后直接从图像中复制。
我认为第一个方案效率更高,尽管还涉及一个复制步骤,但是我不确定。还有其他一些不错的解决方案吗?
谢谢!
答案 0 :(得分:3)
您可能会发现只有第一种解决方案是可行的。规范保证只有VK_IMAGE_USAGE_TRANSFER_SRC_BIT
和/或 VK_IMAGE_USAGE_TRANSFER_DST_BIT
使用情况才适用于具有LINEAR平铺的图像。也可以支持其他用法,但不能保证此支持。因此,您将要实现的代码可能在一个平台上工作,但可能在其他平台上不工作,并且根据您的目标,您可能需要同时实现这两种解决方案。
因此,首先检查您是否能够直接渲染为线性平铺图像。之后,如果可能,请执行您自己的测试并检查哪种解决方案更适合您的情况。或者-如果您想针对更多平台-仅实施第一个通用解决方案,该解决方案应可在任何地方使用。
答案 1 :(得分:3)
第一个解决方案可能会更好。
VK_IMAGE_TILING_LINEAR
可能很糟糕。
非VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT
的内存也可能不好。
第一种解决方案是双缓冲,可以更好地重叠设备本地工作和主机本地工作。
Vulkan Device Memory文章似乎推荐HOST_VISIBLE
与HOST_COHERENT
和HOST_CACHED
作为屏幕截图之类的暂存缓冲区。除了作为溢出内存之外,他们甚至都不敢提及GPU对非DEVICE_LOCAL
内存类型的写入。
What’s your Vulkan Memory Type提到可以根据图像使用情况限制存储类型(vkGetImageMemoryRequirements
)。 VK_IMAGE_TILING_LINEAR
保证具有HOST_VISIBLE
的内存,但是(如@Ekzuzy所说),此限制可能表现为VK_IMAGE_TILING_LINEAR
VkFormat
不支持使用颜色附件(甚至无法进行{ {1}}。
UMA设备可能值得测量nr。 2.这些内存类型通常为vkCreateImage
。虽然如此,但复制速度可能很快,并且渲染到平铺的图像可能会太慢...