我正在阅读Vulkan 内存分配 - 内存主机似乎 VkAllocationCallbacks 可以使用简单的 malloc/realloc/free 函数来实现。
typedef struct VkAllocationCallbacks {
void* pUserData;
PFN_vkAllocationFunction pfnAllocation;
PFN_vkReallocationFunction pfnReallocation;
PFN_vkFreeFunction pfnFree;
PFN_vkInternalAllocationNotification pfnInternalAllocation;
PFN_vkInternalFreeNotification pfnInternalFree;
} VkAllocationCallbacks;
但我认为实现我自己的 vkAllocationCallback 只有两个可能的原因:
- 通过 Vulkan API 记录和跟踪内存使用情况;
- 实现一种堆内存管理,它是一大块需要反复使用和重用的内存。显然,这可能是一种矫枉过正的行为,并且会遇到同样类型的托管内存问题(如在 Java JVM 中)。
我在这里错过了什么吗?
什么样的应用程序值得实现 vkAllocationCallbacks ?
来自spec:
由于大多数内存分配都偏离关键路径,因此这不是
意味着一种性能特征。相反,这对于某些特定的情况可能有用
嵌入式系统,用于调试目的(例如放置一个保护页
在所有主机分配之后),或用于内存分配日志记录。
对于嵌入式系统,您可能一开始就抓住了所有内存,因此您不希望驱动程序调用 malloc,因为容器中可能已经没有任何内存了。保护页和内存日志记录(仅适用于调试版本)对于谨慎/好奇的人可能很有用。
我在某处的幻灯片上读到(抱歉不记得在哪里),您绝对不应该实现仅馈送到 malloc/realloc/free 的分配回调,因为您通常可以假设驱动程序做得比这更好(例如,将小额分配合并到池中)。
我认为,如果您不确定是否应该实现分配回调,那么您不需要实现分配回调,也不需要担心也许您应该实现。
我认为它们适用于那些特定的用例和那些really想要掌控一切。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)