Vulkan屏外渲染:最佳平铺或线性

时间:2018-07-23 11:42:19

标签: vulkan

我想使用Vulkan构建一个屏幕外渲染器,并将渲染内容复制到每一帧的主机内存中。

一种方案是使用带有TILING_OPTIMAL的帧图像,并涉及另一种复制渲染过程,以将内容复制到主机可见的登台缓冲区。

另一种方案是使用带有TILING_LINEAR的帧图像,然后直接从图像中复制。

我认为第一个方案效率更高,尽管还涉及一个复制步骤,但是我不确定。还有其他一些不错的解决方案吗?

谢谢!

2 个答案:

答案 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_VISIBLEHOST_COHERENTHOST_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。虽然如此,但复制速度可能很快,并且渲染到平铺的图像可能会太慢...