版本
menu_open

内存管理技巧和经验总结

以下章节介绍了一系列技巧和经验总结,帮您高效管理游戏中的音频内存。

使用 Memory Threshold

正如之前章节所述,您还可以为声音引擎的各内存池设置内存阈值。音频程序员可以在声音引擎的初始化参数中修改以下值,来设置内存池的 Memory Threshold(内存阈值):

  • AkInitSettings::fDefaultPoolRatioThreshold

  • AkPlatformInitSettings::fLEngineDefaultPoolRatioThreshold

默认情况下,内存阈值被禁用,即使用默认值 1(即 100%)。您可以将其设置为 0 至 1 之间的任意值,来启用内存阈值。

禁用内存阈值后,内存分配器将正常工作。启用后,引擎会定期检查内存占用百分比是否低于该阈值。如果超出阈值,系统将开始忽略优先级最低的声音。

未启用内存阈值时,引擎将按优先顺序播放声音,但内存过低时,引擎可能无法播放高优先级声音,因此将忽略该声音。启用内存阈值时,低优先级的声音将被忽略,给高优先级声音腾出空间。

处理声音引擎中的内存碎片

每次在内存中添加和移除数据块时,都会产生一定数量的碎片。Wwise 本身不会处理内存碎片,但内存池的设计可以帮助减少碎片量。

加载声音结构元数据的 Default memory pool(默认内存池)里主要是小对象,因此出现碎片并不是问题。用于音频管线和处理的 Lower engine memory pool (底层引擎内存池)包含较大的数据块,但当音频终止时,这些数据块都将被释放。对于上述两种内存池,只需分配约 10% 的余量,几乎就能完全避免碎片问题。

存储在 SoundBank(音频包)中的音频数据,每次 LoadBank() 调用时都会拷贝到独立的 User-defined pool(用户定义内存池)中,以便音频程序员更好地控制音频数据的内存管理。为最大程度降低出现内存碎片的可能性,音频程序员可以尝试让内存池使用固定块大小,将 AkFixedSizeBlocksMode 标识传递给 CreatePool,并以该内存池中最大的 SoundBank 大小作为数据块大小。这样分配给各 SoundBank 的内存量都将与最大音频包相等。当然,您还可以创建多个内存池,每个都含有特定数量的槽/块,以供容纳特定大小的音频包。AkFixedSizeBlocksMode 内存池的数据块大小全部相同,并可以通过 GetBlock() 查询。使用这一技巧可以完全避免内存碎片。


此页面对您是否有帮助?

需要技术支持?

仍有疑问?或者问题?需要更多信息?欢迎联系我们,我们可以提供帮助!

查看我们的“技术支持”页面

介绍一下自己的项目。我们会竭力为您提供帮助。

来注册自己的项目,我们帮您快速入门,不带任何附加条件!

开始 Wwise 之旅