前言
最近在研究Vulkan,在Vulkan中使用内存是个麻烦的过程,而且容易用错,今天就给大家分享下Vulkan的内存模型。
内存,在任何时候都是个稀缺的资源,内存管理更是个让人望而却步的事情。在这个崇尚用户体验的今天,不管是底层系统还是上层应用都在追求极致的性能优化,内存优化也是重中之重。从系统层的分页,池化,脏页回收,连续大内存到上层的优化的数据结构,内存共享,压缩等都在不停地压榨系统内存以获得更高性能的应用程序。
Vulkan内存初心
我认为简单地理解Vulkan区别于OpenGL的最大特点就是Vulkan可以让应用开发者细粒度的控制,在内存方面也是如此。因为Vulkan认为应用自身对于内存占用是最清楚的,内存的创建释放,生命周期都是应用自身的行为导致的。面对复杂的应用场景,很难有通用的优化策略解决所有问题。不管是通过虚拟机还是驱动程序,帮助应用进行内存管理永远是低效的。
基于上述原因,Vulkan将内存管理的工作交给了开发者负责,如何分配释放内存,怎样制定内存策略都由开发者自己决定,这无疑是返璞归真的至理。但话说回来这样的机制对开发者来说却不是友好的,所以我们更需要知道Vulkan的内存模型才能更高效地管理。
Vulkan内存管理
Vulkan中的内存分为两种:宿主内存和设备内存。
这两种内存的特点是宿主内存比设备内存慢。但是宿主内存的容量通常更大。另一方面来说,设备内存是直接对物理设备可见的,因此它更有效率也更为快速。
宿主内存
Vulkan使用宿主内存来存储API的内部数据结构。Vulkan提供了内存分配器机制,允许应用程序控制宿主机端的内存分配。如果应用程序不使用分配器机制,那么Vulkan将使用一个默认的分配器来管理内存和数据结构。
主机内存管理通过以下数据结构来完成:
typedef struct VkAllocationCallbacks {
Void* pUserData;
PFN_vkAllocationFunction pfnAllocation;
PFN_vkReallocationFunction pfnReallocation;
PFN_vkFreeFunction pfnFree;
PFN_vkInternalAllocationNotification pfnInternalAlloc;
PFN_vkInternalFre