目录

Wwise SDK 2018.1.11
Memory Manager

Wwise 声音引擎的所有模块都通过 AK::MemoryMgr 接口访问内存。声音引擎的客户程序负责此接口的初始化和终止。

SDK 以 静态库 (AkMemoryMgr.lib)的方式提供了一个默认实现。要使用这个库,客户需要定义几个函数:AK::AllocHook()、AK::FreeHook() 和针对平台的变体。AK::AllocHook()AK::FreeHook() 只需重定向到标准 malloc 和 free 函数,而其它分配器必须通过 AkMemoryMgr.h 中记载的特定 OS 调用。AK::MemoryMgr::Init() 出厂函数列于 AkModule.h 中。

请参阅 构建配置 了解有关 AkMemoryMgr.lib 和其它库的使用的更多信息。

初始化

在初始化内存管理器时,重要的是指定最大内存池数量,这些内存池是在内存管理器生命期间容纳所有模块所需要的。根据构建配置和存在哪些模块,初始化时将创建大约 14 个内存池。另外会为所有已加载的 SoundBank 创建一个额外的内存池(如果在调用 AK::SoundEngine::LoadBank() 时没有指定现有的内存池)。

请参阅 示例 了解例程和有关在游戏中初始化内存管理器的更多信息。

请参阅 加载 SoundBank 了解有关 SoundBank 内存占用的更多信息。

内存池

内存管理器的整个生命期间均可创建和销毁内存池。内存池分成许多大小相同的块,这些块代表最小的分配单元。如果使用默认的内存管理器实现,内存池一旦创建,就不可以重新分配大小。请参阅 取代内存管理器 了解有关创建自定义内存管理器的信息。

Note: 在 Xbox One 上,包含 XMA 文件的 SoundBank 需要加载到使用 AkPhysicalAlloc 类型创建的内存池中。

Note: 创建的每个内存池都添加了额外的 7.2 KBytes 空间用于内存池内部管理。在创建的内存池与块大小相等时,不会添加额外的内存开销。即使只会用到一个内存块,使用内存池也很重要,因为这样可以在 Wwise 性能分析器中查看到所有内存统计数据。

请参阅 优化内存池 了解有关选择内存池最佳大小的信息。

取代内存管理器

客户可以自行实现 AK::MemoryMgr 接口。以下是在执行时需要注意的几点。

AK::MemoryMgr::CreatePool() 必须遵守分配类型参数的要求。

客户可以选择允许动态决定内存池的最大数量,并可重新分配单个内存池的大小。这可以为声音引擎提供更大的灵活性,代价是牺牲了可预测性。

请参阅 AK::MemoryMgr 名字空间,了解在取代默认内存管理器时需要使用的方法的详情。