一个设备内存中的多个缓冲区

问题描述 投票:0回答:1

我想将多个缓冲区合并到一个设备内存中。

  1. 如果他们的对齐要求不同,在分配和映射内存时应该如何对待。我是否应该根据这些对齐来计算分配大小,并且在映射它们时是否应该使用它们的 VkBufferCreateInfo 的大小或 VkMemoryRequirements 的大小和偏移对齐。

  2. 我意识到,当缓冲区使用发生变化时,对齐方式也会发生变化(如 VERTEX_BIT 和 UNIFORM_BIT)。我创建了 52 字节缓冲区,当使用为 VERTEX_BIT 时,对齐为 16 字节,这是可以理解的,但当使用为 UNIFORM_BIT 时,对齐为 64 字节。这怎么可能,它是如何运作的?我无法通过使用 Nsight 图形看到差异,因为它没有显示 api 如何使用这些缓冲区的方式。 谢谢...

memory alignment buffer vulkan
1个回答
0
投票

必须遵守缓冲区的对齐方式或缓冲区中间的对齐方式。内存分配的首地址实际上为 0,因此它与所有可能的用途保持一致。任何从非零偏移量开始的缓冲区都必须使用与您对该缓冲区的使用情况适当对齐的偏移量。

是的,在决定分配多少时,您必须考虑填充,以确保您打算进行的所有缓冲区子分配都正确对齐。

对于映射,您不映射缓冲区;你映射内存。如果内存是主机可见的,则应在分配内存时立即映射整个分配,并使其保持映射状态,直到销毁内存为止。临时仅映射分配的一小部分不会有任何好处。 Vulkan 不会以任何方式阻止您在映射时使用分配。

当用法为 VERTEX_BIT 时,对齐为 16 字节,这是可以理解的,但当用法为 UNIFORM_BIT 时,对齐为 64 字节。这怎么可能,它是如何工作的?

这是“可能的”,因为实现是这么说的。实现决定了特定用途的对齐需要什么,这就是它的全部内容。你的工作不是理解“它是如何工作的”;而是理解“它是如何工作的”。就是遵守要求。

© www.soinside.com 2019 - 2024. All rights reserved.