VK_EXT_memory_priority

内存管理是 Vulkan 的重要组成部分。VK_EXT_memory_priority 扩展旨在允许应用程序防止重要的分配被移动到较慢的内存。

可以通过两个应用程序(主应用程序和主机上的另一个进程)的示例来解释此扩展。随着时间的推移,两个应用程序都试图消耗有限的设备堆内存。

VK_EXT_memory_priority_overview

在这种情况下,来自主应用程序的分配仍然存在,只是可能在较慢的内存上(实现可能已将其移动到主机可见内存,直到再次需要它)。

什么 内存将被移动的决定是实现定义的。现在让我们假设这是主应用程序的内存使用情况

VK_EXT_memory_priority_app

正如我们所见,应用程序认为某些内存对于始终尝试保持在快速内存中更为重要。

VK_EXT_memory_priority 扩展使这非常容易。在分配内存时,应用程序只需将 VkMemoryPriorityAllocateInfoEXT 添加到 VkMemoryAllocateInfo::pNext。从这里,可以使用 0.01.0 之间的值设置 VkMemoryPriorityAllocateInfoEXT::priority 值(其中 0.5 是默认值)。如果发生上述情况,这允许应用程序帮助实现做出更好的猜测。

建议

  • 确保支持该扩展。

  • 请记住,这只是对实现的 提示,应用程序仍应在可能的情况下在正确使用此功能之前预算好。

  • 尽可能始终测量内存瓶颈,而不是进行假设。

  • 正在写入的任何内存都有很大可能具有高优先级。

    • 渲染目标(例如:帧缓冲区的输出附件)通常设置为高优先级很重要

  • 将高优先级内存视为具有“高频率访问”和“低延迟容忍度”

    • 例如:在多个帧之间保持稳定的顶点缓冲区,每个值仅访问一次,并且通常可以容忍访问延迟,因此通常是较低优先级的良好选择。