如何在 Vulkan 中重新分配缓冲区
How to suballocate buffers in Vulkan
在 Vulkan 中推荐的内存管理方法是缓冲区的子分配,例如下图。
我正在尝试实施“好的”方法。我有一个系统可以告诉我内存分配的可用位置,因此我可以绑定单个大缓冲区的子区域。
但是,我找不到执行此操作的机制,或者只是误解了正在发生的事情,因为绑定函数将缓冲区作为输入和偏移量。除了通过现有缓冲区之外,我看不到如何指定绑定的大小。
所以我猜想有几个问题:
- 下图中的虚线矩形只是绑定,还是额外的缓冲区?
- 如果它们是绑定,我如何告诉 Vulkan(最好使用 VMA)使用缓冲区的那一部分?
- 如果它们是额外的缓冲区,我该如何创建它们?
- 如果两者都不是,它们是什么?
我已经阅读了一些自定义分配器,但它们似乎遵循了“糟糕”的方法,将偏移量返回到用于绑定的大型分配中,因此仍然有大量缓冲区但分配计数较低。
需要明确的是,除了通过 VMA 之外,我没有使用自定义分配器回调;我上面提到的“系统”位于 VMA 调用之上。
非常感谢任何指点!
are the dotted rectangles in the image below just bindings, or are they additional buffers?
它们代表实际数据。所以“索引”块是包含顶点索引的存储范围。
if they are bindings, how do I tell Vulkan (ideally using VMA) to use that subsection of the buffer?
这取决于您如何将 VkBuffer
用作资源的特定性质。一般来说,每个使用 VkBuffer
作为资源的函数都需要一个字节偏移量,表示从哪里开始读取。许多此类函数还采用一个大小,该大小与偏移量一起表示可以通过该特定资源读取的全部数据量。
例如,vkCmdBindVertexBuffers
采用 VkBuffer
的数组,对于每个 VkBuffer
,它还采用一个字节偏移量,表示该顶点缓冲区的起点。 VkDescriptorBufferInfo
,表示描述符使用的缓冲区的结构,采用 VkBuffer
、字节偏移量和大小。
顶点缓冲区(和索引缓冲区)绑定没有大小,但它们不需要。它们的有效大小由与它们一起使用的渲染命令(以及它读取的索引数据)定义。如果您使用 100 个 32 位索引进行渲染,则预期索引缓冲区的大小减去起始偏移量应至少为 400 字节。如果不是,则 UB 结果。
在 Vulkan 中推荐的内存管理方法是缓冲区的子分配,例如下图。
我正在尝试实施“好的”方法。我有一个系统可以告诉我内存分配的可用位置,因此我可以绑定单个大缓冲区的子区域。 但是,我找不到执行此操作的机制,或者只是误解了正在发生的事情,因为绑定函数将缓冲区作为输入和偏移量。除了通过现有缓冲区之外,我看不到如何指定绑定的大小。
所以我猜想有几个问题:
- 下图中的虚线矩形只是绑定,还是额外的缓冲区?
- 如果它们是绑定,我如何告诉 Vulkan(最好使用 VMA)使用缓冲区的那一部分?
- 如果它们是额外的缓冲区,我该如何创建它们?
- 如果两者都不是,它们是什么?
我已经阅读了一些自定义分配器,但它们似乎遵循了“糟糕”的方法,将偏移量返回到用于绑定的大型分配中,因此仍然有大量缓冲区但分配计数较低。 需要明确的是,除了通过 VMA 之外,我没有使用自定义分配器回调;我上面提到的“系统”位于 VMA 调用之上。
非常感谢任何指点!
are the dotted rectangles in the image below just bindings, or are they additional buffers?
它们代表实际数据。所以“索引”块是包含顶点索引的存储范围。
if they are bindings, how do I tell Vulkan (ideally using VMA) to use that subsection of the buffer?
这取决于您如何将 VkBuffer
用作资源的特定性质。一般来说,每个使用 VkBuffer
作为资源的函数都需要一个字节偏移量,表示从哪里开始读取。许多此类函数还采用一个大小,该大小与偏移量一起表示可以通过该特定资源读取的全部数据量。
例如,vkCmdBindVertexBuffers
采用 VkBuffer
的数组,对于每个 VkBuffer
,它还采用一个字节偏移量,表示该顶点缓冲区的起点。 VkDescriptorBufferInfo
,表示描述符使用的缓冲区的结构,采用 VkBuffer
、字节偏移量和大小。
顶点缓冲区(和索引缓冲区)绑定没有大小,但它们不需要。它们的有效大小由与它们一起使用的渲染命令(以及它读取的索引数据)定义。如果您使用 100 个 32 位索引进行渲染,则预期索引缓冲区的大小减去起始偏移量应至少为 400 字节。如果不是,则 UB 结果。