日志
2020/10/14 增加快速入门、环境配置、初始化、资源创建
Version 3.0.0-development (2020-06-24)
快速入门
配置环境
Vulkan Memory Allocator 使用标准格式定义的单头文件工程,不需要其他库文件。你可以将头文件直接加入到你的工程源码中。
"单头文件"并不意味着所有的声明都是用C++声明,有些是使用内联函数或者模板声明的。意思是说实现是和接口在同一个文件中。并且使用编译器宏做扩展。如果配置不对将会引发链接错误。
正确的配置做法:
- 在每个你要使用VMA的CPP文件中包含"vk_mem_alloc.h"头文件
- 在每个包含"vk_mem_alloc.h"头文件的前面激活内部定义宏:VMA_IMPLEMENTATION
#define VMA_IMPLEMENTATION
#include "vk_mem_alloc.h"
对于零散的CPP文件来说,这样声明是一个好主意。
当前VMA虽然是使用C++书写,但也有兼容C语言的接口。因此 vk_mem_alloc.h 可以在C和C++项目中使用。但是VMA_IMPLEMENTATION
宏必须作为c++的一部分进行编译而不是作为C语言编译。
请注意该库内部包含了<vulkan/vulkan.h>头文件,如果是Windows系统又会包含 <windows.h> 头文件,如果你需要一些特殊的宏(比如 Windows 的
WIN32_LEAN_AND_MEAN,Vulkan 的 VK_USE_PLATFORM_WIN32_KHR)必须在包含
含"vk_mem_alloc.h"头文件的前面定义声明。
初始化
初始化步骤:
- 初始化Vulkan并创建 VkPhysical、VkDevice 和 VkInstance 句柄
- 填写 VmaAllocatorCreateInfo 结构体并且通过 vmaCreateAllocator() 函数创建 VmaAllocator 句柄对象
VmaAllocatorCreateInfo allocatorInfo = {};
allocatorInfo.physicalDevice = physicalDevice;
allocatorInfo.device = device;
allocatorInfo.instance = instance;
VmaAllocator allocator;
vmaCreateAllocator(&allocatorInfo, &allocator);
资源创建
当你想创建缓存(VkBuffer)和图片(VkImage)时:
- 填写
VkBufferCreateInfo
或VkImageCreateInfo 结构体
填写 VmaAllocationCreateInfo 结构体
调用 vmaCreateBuffer() 或 vmaCreateImage() 创建 VkBuffer 或 VkImage 并其库内部已经将需要的内存分配并绑定完成。
VkBufferCreateInfo bufferInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };
bufferInfo.size = 65536;
bufferInfo.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;
VmaAllocationCreateInfo allocInfo = {};
allocInfo.usage = VMA_MEMORY_USAGE_GPU_ONLY;
VkBuffer buffer;
VmaAllocation allocation;
vmaCreateBuffer(allocator, &bufferInfo, &allocInfo, &buffer, &allocation, nullptr);
最后不要忘记用完销毁回收
vmaDestroyBuffer(allocator, buffer, allocation);
vmaDestroyAllocator(allocator)