我想使用 Vulkan 构建一个离屏渲染器,并在每一帧中将渲染内容复制到主机内存。
一种方案是使用具有 TILING_OPTIMAL 的帧图像,并涉及另一个复制渲染 channel 以将内容复制到主机可见暂存缓冲区。
另一种方案是使用带 TILING_LINEAR 的帧图像,并直接从图像复制。
我认为第一种方案效率更高,虽然涉及到更多的复制步骤,但我不确定。还有一些更体面的解决方案吗?
谢谢!
最佳答案
第一个解决方案可能更好。
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
不支持使用颜色附件(甚至阻止执行 vkCreateImage
)。
UMA 设备可能值得衡量方法 nr。 2. 这些内存类型通常是 DEVICE_LOCAL|HOST_VISIBLE|HOST_CACHED
。虽然仍然如此,但复制速度可能很快,而渲染到平铺不佳的图像可能会太慢...
关于Vulkan 离屏渲染 : TILING OPTIMAL or LINEAR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51477954/