为什么我对图像的对齐内存要求如此之高?

Why am I getting such a large alignment memory requirement for an image?

我在 Vulkan 中创建了一个图像,我在 131072 的内存要求中得到了对齐要求。这似乎是一个巨大的对齐,我不确定为什么可能需要大于 128 或 256 的任何东西。它太大了,我的内存分配算法甚至无法处理它,并且永远无法实际处理它,因为这种严格对齐的每次分配都会浪费太多 space。这背后的交易是什么?这是我创建图像的方式:

VkImageCreateInfo create_info{};
create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
create_info.imageType = VK_IMAGE_TYPE_2D;
create_info.pNext = nullptr;
create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
create_info.samples = VkSampleCountFlagBits::VK_SAMPLE_COUNT_1_BIT;
create_info.queueFamilyIndexCount = 0;

image_create_info.extent.width = 1716;
image_create_info.extent.height = 1731;
image_create_info.extent.depth = 1;
image_create_info.usage = VkImageUsageFlagBits::VK_IMAGE_USAGE_SAMPLED_BIT;
image_create_info.tiling = VkImageTiling::VK_IMAGE_TILING_OPTIMAL;
image_create_info.initialLayout = VkImageLayout::VK_IMAGE_LAYOUT_UNDEFINED;
image_create_info.flags = 0;
image_create_info.mipLevels = 1;
image_create_info.format = VK_FORMAT_R8G8B8A8_UINT;
image_create_info.arrayLayers = 1;

VkImage vk_image;
VkResult result = vkCreateImage((VkDevice)VK::logicalDevice, &image_create_info, nullptr, &vk_image);

VkMemoryRequirements requirements;
vkGetImageMemoryRequirements(VK::logicalDevice, vk_image, &requirements);

关于函数返回的要求的另一个有趣的事情是格式 VK_FORMAT_R8G8B8A8_UINT 的内存大小要求约为 12 mb,这是有道理的,但是格式为 VK_FORMAT_R8G8B8_UINT(所以没有alpha 通道),它给出的大小要求仅为 3 mb,大约是大小的四分之一。我 运行 遇到了某种错误吗?

我知道我创建的图像的尺寸不是二的幂,但这应该不会导致这种奇怪的行为,对吗?

It's so big that my memory allocation algorithm can't even handle it and will never be able to practically handle it given that each allocation of this strict an alignment will waste too much space.

然后修正那个

允许实施要求各种对齐方式,尤其是 optimally-tiled 图像。 128KiB 对齐对于图像来说几乎是不合理的。所以你的 sub-allocator 需要能够解决这个问题。

至于“浪费太多 space”,也许您应该再看看这些数字。示例纹理必须至少占用 11'881'584 字节。 128KiB 略多于该存储的 1%。这不是很多浪费。