文章目录

  • 前言
  • 二、初始化
  • 三、资源分配小案例
  • 总结

前言

VMA(Vulkan Memory Allocator),是AMD提供的Vulkan内存分配管理器,那么Vulkan的内存分配为何要使用VMA这种内存分配器呢?原因就在于其显存的分配次数是有限的(比如4096次),那么我们就需要分配一整块显存,然后自己使用offset以及size来进行分割使用,这个过程冗长繁杂,而且容易出错,那么VMA就成为了我们管理Vulkan内存的首要选择


提示:本文为系列系列教程,定时更新,请大家关注。如果需要深入学习Vulkan的同学,可以点击课程链接:

腾讯课堂:《Vulkan原理与实战—铸造渲染核武器—基石篇》

网易课堂:《Vulkan原理与实战—铸造渲染核武器—基石篇》

Vulkan学习群:594715138


# 一、工程安装

Vulkan Memory Allocator属于单头文件的“stb-style”风格库。你不需要单独去构建它,只需要把头文件加入到工程里就好了。
Single Header”并不意味着所有功能都已经作为了inline函数,而是说需要用预编译宏来导出这些函数,如果你不使用宏来导出函数就会遇到链接错误。
引入方法
1 包含“ vk_mem_alloc.h ”头文件到任何一个用得到vma的cpp文件当中,这样vma的各种成员声明就可以完成了。
2 在其中一个cpp文件当中,开启如下的宏定义。

#define VMA_IMPLEMENTATION
#include "vk_mem_alloc.h"

对于使用者而言,可能单独创建一个cpp文件,专门用来书写上述代码,即专门用来导出VMA的成员实现(比如命名为vmaExporter.cpp)。

这个库的头文件里面已经包含了<vulkan/vulkan.h>,因此也间接包含了<windows.h>,在这两个头文件之前如果你需要定义一些宏来启用/关闭特性,那么请在vma头文件引入之前来定义。

对于VMA而言,库内部肯定会调用vulkan的函数,那么你的工程对于vulkan方面的配置就可以如下灵活处理:

1 默认情况下(推荐):
vma是认为你链接了vulkan的静态库(lib),则直接就调用vulkan函数,随后在编译期间就顺利链接(link),即无脑模式。
如果你不是用的vulkan静态库,就可以在vma头文件引入之前,做一个声明

#define VMA_STATIC_VULKAN_FUNCTIONS 0

然后就可以开启下面的引入方法了。

2 自动获取Vulkan函数:
你可以定义:

#define VMA_DYNAMIC_VULKAN_FUNCTIONS 1:

然后使用VmaAllocatorCreateinfo当中的pVulkanFunction这个成员变量,这个变量其实指向的是一个结构体:

typedef struct VmaVulkanFunctions
{/// Required when using VMA_DYNAMIC_VULKAN_FUNCTIONS.PFN_vkGetInstanceProcAddr VMA_NULLABLE vkGetInstanceProcAddr;/// Required when using VMA_DYNAMIC_VULKAN_FUNCTIONS.PFN_vkGetDeviceProcAddr VMA_NULLABLE vkGetDeviceProcAddr;PFN_vkGetPhysicalDeviceProperties VMA_NULLABLE vkGetPhysicalDeviceProperties;PFN_vkGetPhysicalDeviceMemoryProperties VMA_NULLABLE vkGetPhysicalDeviceMemoryProperties;PFN_vkAllocateMemory VMA_NULLABLE vkAllocateMemory;PFN_vkFreeMemory VMA_NULLABLE vkFreeMemory;
PFN_vkMapMemory VMA_NULLABLE vkMapMemory;
//以下省略---------------------------------
}

这是vma定义的结构体,用来规定每一个Vulkan函数对应的函数指针,在其中,指定下vkGetInstanceProcAddrvkGetDeviceProcAddr两个函数,vma就会自动把其他的vulkan函数给获取出来了。

3 全面赋值:
你甚至可以自己手动去填写上方的哪个结构体,直接为每一个vulkan的函数指定其函数指针。

二、初始化

在程序开始的时候:
1 初始化vulkan,生成VkPhysicalDevice,VkDevice与VkInstance等对象。
2 填写VmaAllocatorCreateInfo,随后使用vmaCreateAllocator创建一个VmaAllocator

VmaAllocatorCreateInfo allocatorInfo = {};
allocatorInfo.vulkanApiVersion = VK_API_VERSION_1_2;allocatorInfo.physicalDevice = physicalDevice;
allocatorInfo.device = device;
allocatorInfo.instance = instance;VmaAllocator allocator;
vmaCreateAllocator(&allocatorInfo, &allocator);

如上所示,你需要指定你使用的vulkan版本,当然你也可以通过VmaAllocatorCreateInfo::flags 指定你要开启的vma扩展(这个我们后面详细讲解),否则vma会默认使用vulkan的1.0内核并且无扩展开启。

三、资源分配小案例

当你想生成一个buffer或者image

  • 填写VkBufferCreateInfo/VkImageCreateInfo结构体;
  • 填写VmaAllocationCreateInfo结构体。
  • 调用vmaCreateBuffer/vmaCreateImage来获取内存,并且完成vkImage/vkBuffer与相应内存的绑定操作(Bind):
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);

总结

以上就是今天的内容,大家对于vulkan的学习,也可以参考我出品的vulkan系列教程,下面给大家贴出链接。

腾讯课堂:《Vulkan原理与实战—铸造渲染核武器—基石篇》

网易课堂:《Vulkan原理与实战—铸造渲染核武器—基石篇》

Vulkan系列教程—VMA教程(一)—快速上手VMA相关推荐

  1. Python Flask Web教程002:Flask 快速上手

    Flask Web教程002:Flask 快速上手 0. 前言 1. Web基础知识 2. 第一个flask web程序 3. 总结 0. 前言 web开发中有一些共同的功能,比如:数据库驱动.网页模 ...

  2. 【游戏开发教程】Unity Cinemachine快速上手,详细案例讲解(虚拟相机系统 | 新发出品 | 良心教程)

    文章目录 一.前言 二.插件下载 三.案例1:第三人称自由视角,Free Look character场景 1.场景演示 2.组件参数 2.1.CinemachineBrain:核心 2.2.Cine ...

  3. 【游戏开发教程】Unity Cinemachine快速上手,详细案例讲解(虚拟相机系统 新发出品 良心教程)

    文章目录 一.前言 二.插件下载 三.案例1:第三人称自由视角,Free Look character场景 1.场景演示 2.组件参数 2.1.CinemachineBrain:核心 2.2.Cine ...

  4. cubase怎么添加midi设备_Cubase教程丨20分钟快速上手Cubase(下)

    插入乐器轨 在cubase中,乐器轨是我们最常用的轨道之一.我们可以在创建轨道区,点击左键,选择"添加乐器轨". 在箭头所指的方向,可以选择相应的vst乐器.没有安装音色的同学,也 ...

  5. AngularJS2.0教程(一)快速上手之基础知识

    Why Angular2 Angular1.x显然非常成功,那么,为什么要剧烈地转向Angular2? 性能的限制 AngularJS当初是提供给设计人员用来快速构建HTML表单的一个内部工具.随着时 ...

  6. Redux入门教程详解(快速上手)

    典型的Web应用程序通常由共享数据的多个UI组件组成.通常,多个组件的任务是负责展示同一对象的不同属性.这个对象表示可随时更改的状态.在多个组件之间保持状态的一致性会是一场噩梦,特别是如果有多个通道用 ...

  7. Vue系列之十二: 实战快速上手

    我们采用实战教学模式并结合ElementUI组件库,将所需知识点应用到实际中,以最快速度带领大家掌握Vue的使用: 12.1.创建工程 注意:命令行都要使用管理员模式运行 1.创建一个名为hello- ...

  8. endnote一打开就自动关闭_【EndNote文献管理】5分钟快速上手Endnote

    EndNote是我们在撰写和编辑论文中常用的软件,有了它可以让我们更加快速的管理参考文献,也可以更方便地插入和编辑参考文献. 本篇教程教你如何快速上手EndNote,通过几个常用的功能就可以迅速掌握这 ...

  9. Arduino机器人快速上手经验分享(L298N马达驱动,摇杆模块)

    Bill of Material: 直流马达(<9V, 2A) x2, 底盘 x1,9V电池 x1, 电池扣 x1, 摇杆模块 x1, L298N 马达驱动模块 x1, Arduino Uno ...

最新文章

  1. 计算机接口配件,最近发布:最新的计算机外部接口计算机主板外部接口简介计算机主板接口简介...
  2. .NET 云原生架构师训练营(模块二 基础巩固 配置)--学习笔记
  3. php 解析http,用PHP手动解析原始HTTP数据
  4. Linux把日志文件转换成xml,[转载]将 HTML 文件转换成 XML
  5. 如何在Mac上高质量的进行PDF OCR转换
  6. 关于ODBC使用SQL语句和调用存储过程传递参数的使用方式说明
  7. Matlab遗传算法
  8. 计算机发展趋势 五笔型码,计算机五笔识别码字有哪些
  9. 聊一聊数据团队的职责是什么?
  10. POJ 3626 Mud Puddles(超简单BFS)
  11. Linux查看服务器硬件网卡cpu型号内存BIOS、主板型号信息
  12. SpringBoot+vue仿网易云音乐网站(三)- Springboot项目以及前端vue基础搭建
  13. 文内码转换巨匠增强版 官方版
  14. nova6se是华为鸿蒙系统吗,华为荣耀9x和nova6se哪个性价比高?_科技数码通
  15. 《脚本》Scapy刺探星巴克无线网,记录顾客信息
  16. 2023年中国人民大学信息资源管理学院信息分析考研上岸前辈经验
  17. (汇编语言)逻辑地址转换物理地址
  18. linux中磁盘满了?一招教你快速清理
  19. jmeter 计数器_Jmeter计数器的使用
  20. 如何在html中加入项目列表,css如何添加列表项目符号

热门文章

  1. python中np zeros_Python numpy.zeros方法代码示例
  2. 中国银行业数字化转型研究报告 附下载
  3. Linux 网络不可达
  4. (JS)寻找两个有序数组的中位数
  5. [luogu2059 JLOI2013] 卡牌游戏 (概率dp)
  6. 【单调队列】数据结构之单调队列详解
  7. 彻底变换PreferenceFragment样式和全局设置字体样式的解决方案
  8. 【转】应届毕业生要知道的几个小东西,,三方协议,,报到证,,干部身份
  9. JavaScript模块化入门
  10. linux清理缓存的命令