繁体   English   中英

如何在 Vulkan 中子分配缓冲区

[英]How to suballocate buffers in Vulkan

在 Vulkan 中管理 memory 的推荐方法是缓冲区的子分配,例如见下图。

我正在尝试实施“好的”方法。 我有一个系统可以告诉我 Memory 分配可用的位置,因此我可以绑定单个大缓冲区的子区域。 但是,我找不到执行此操作的机制,或者只是误解了正在发生的事情,因为绑定函数将缓冲区作为输入和偏移量。 除了通过现有缓冲区之外,我看不到如何指定绑定的大小。

所以我想我有几个问题:

  • 下图中的虚线矩形只是绑定,还是额外的缓冲区?
  • 如果它们是绑定,我如何告诉 Vulkan(最好使用 VMA)使用缓冲区的那部分?
  • 如果它们是额外的缓冲区,我该如何创建它们?
  • 如果两者都不是,它们是什么?

我已经阅读了一些自定义分配器,但它们似乎遵循“坏”方法,将偏移量返回到大型分配中以进行绑定,因此仍然有大量缓冲区但分配计数较低。 需要明确的是,除了通过 VMA 之外,我没有使用自定义分配器回调; 我上面提到的“系统”位于 VMA 调用之上。

非常感谢任何指针!

这里

下图中的虚线矩形只是绑定,还是额外的缓冲区?

它们代表实际数据。 所以“索引”块是包含顶点索引的存储范围。

如果它们是绑定,我如何告诉 Vulkan(最好使用 VMA)使用缓冲区的那部分?

这取决于您如何将该VkBuffer用作资源的特定性质。 一般来说,每一个使用VkBuffer作为资源的 function 都需要一个字节偏移量,该偏移量表示从哪里开始读取。 许多此类函数还采用与偏移量相结合的大小,表示可以通过该特定资源读取的全部数据量。

例如, vkCmdBindVertexBuffers接受一个VkBuffer数组,并且对于每个VkBuffer它还接受一个字节偏移量,该偏移量表示该顶点缓冲区的起点。 VkDescriptorBufferInfo是表示描述符使用的缓冲区的结构,它采用VkBuffer 、字节偏移量和大小。

顶点缓冲区(和索引缓冲区)绑定没有大小,但它们不需要大小。 它们的有效大小由与它们一起使用的渲染命令(以及它读取的索引数据)定义。 如果您使用 100 个 32 位索引进行渲染,则预期索引缓冲区的大小减去起始偏移量后应至少为 400 字节。 如果不是,UB 结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM