使用malloc/free()实现Vulkan的VkAllocationCallbacks

Ale*_*rth 3 memory memory-management vulkan

我正在阅读Vulkan内存分配 - 内存主机,似乎可以使用天真的malloc/realloc/free函数实现VkAllocationCallbacks.

typedef struct VkAllocationCallbacks {
   void*                                   pUserData;
   PFN_vkAllocationFunction                pfnAllocation;
   PFN_vkReallocationFunction              pfnReallocation;
   PFN_vkFreeFunction                      pfnFree;
   PFN_vkInternalAllocationNotification    pfnInternalAllocation;
   PFN_vkInternalFreeNotification          pfnInternalFree;
} VkAllocationCallbacks;
Run Code Online (Sandbox Code Playgroud)

但我发现实现自己的vkAllocationCallback只有两个可能的原因:

  • 通过Vulkan API记录和跟踪内存使用情况;
  • 实现一种堆内存管理,它是一大块内存,可以反复使用和重用.显然,它可能是一种过度杀伤并遭受托管内存的同类问题(如在Java JVM中).

我在这里错过了什么吗?什么样的应用程序值得实现vkAllocationCallbacks?

Col*_*mbo 5

根据规范:"由于大多数内存分配都不在关键路径上,因此这不是一个性能特征.相反,这对某些嵌入式系统非常有用,用于调试目的(例如,在所有主机分配后放置一个保护页面),或者用于内存分配日志记录."

使用嵌入式系统,您可能在开始时就已经占用了所有内存,因此您不希望驱动程序调用malloc,因为坦克中可能没有任何内容.保护页面和内存日志记录(仅适用于调试版本)可能对谨慎/好奇很有用.

我在某个地方读过幻灯片(不记得哪里,对不起),你肯定不应该实现只能通过malloc/realloc/free的分配回调,因为你通常可以认为驱动程序的工作要好得多(例如,将小额分配合并到池中).

我认为如果你不确定是否应该实现分配回调,那么你不需要实现分配回调,你也不必担心也许你应该有.

我认为它们适用于那些特定用例以及那些真正希望掌控一切的用户.