Wwise SDK 2021.1.6
优化内存分配
备注: 我们在 Wwise 2019.2 版本中对内存管理器进行了全面修改。以下说明仅适用于 2019.2 及后续版本。

Wwise 声音引擎所执行的内存分配可大致分为两类:声音引擎初始化时实施的各项固定大小分配以及动态分配。

固定大小分配

有些固定大小分配可通过初始化参数来控制。下面列出了初始化时内存分配的控制参数:

其中,uIOMemorySize 最为重要。此流播放缓冲区大小的设置应基于最多同时流播放的声音数、声音的比特率和流播放声音的安全时间要求。对有些游戏来说,8 MB 的默认值好像有点浪费内存。不过在开始时最好分配较大的内存,等稍后明确了内存用量再进行削减。有关流播放缓冲区内存的详情,请参阅 Audiokinetic Stream Manager 初始化设置

动态分配

如需详细了解声音引擎所执行的各种内存分配,请参阅 AkMemID 中有关内存分配类别的说明。Wwise 内 Advanced Profiler(高级性能分析器)视图的 Memory(内存)选项卡中会报告各个类别的统计信息。

您可以在 Monitor Queue(监控队列)和 Profiler(性能分析器)类别中专门为调试分配内存池。不过,Release 版本中并不会使用这些类别的内存池。您只需减去这些类别的内存池大小便可清楚地了解 Release 版本的内存用量。

备注: 您还可以在不连接到游戏的情况下,在 Memory 选项卡中查看声音引擎的内存占用量,方法是通过从 Wwise 本身直接捕获(Capture)性能分析信息。

运行内存不足

声音引擎所执行的内存分配总量可通过 AkMemSettings::uMemAllocationSizeLimit 初始化参数来控制。在设定限值后,声音引擎会根据内存不足情况的出现时机做出不同的反应。例如,在以下场景中内存不足时会发生以下情况:

  • 声音引擎初始化:初始化失败。
  • 加载 SoundBank : SoundBank 加载失败。
  • 某个参数开始过渡,例如音量:参数直接跳到目标值,不经过任何过渡。
  • 播放声音:播放失败或者停止了另一个低优先级的播放,为新的播放释放内存。

检测内存问题

在使用 Wwise Profiler 时,游戏中每发生一次分配失败就会向捕获日志中发送一条警告通知。您可以通过检查该通知列表来查明游戏当中达到内存限值时所涉及的内存类别。

内存占用高的原因

以下原因可导致内存占用高:

  • 加载 SoundBank 会增加 Object 和 Media 内存用量。注意,各个 SoundBank 使用的内存量不同。Object 类别中 SoundBank 所用的内存不取决于 SoundBank 的物理大小,而取决于其包含的结构和 Event 数量。
  • 有些效果器(包括混响和延迟)会在播放时消耗大量的 Processing 内存。
  • 同时播放多个声音会大大增加 Processing 内存用量。
  • 短时间内发送多个 Action 会增加 Object 内存用量。
  • 注册游戏对象、设置“对象作用域”参数、设置对象位置时都会占用少量的内存。然而,请注意必须注销未使用的游戏对象,以腾出内存。否则内存占用量会持续上升。
警告: 在测试考察内存用量峰值时,必须确保将游戏当前所用扬声器设为最高配置(比如,在使用系统音频输出设备时,在电脑上设为 7.1)。这样做很有必要。因为在将扬声器设为立体声时声音引擎会实施一定的优化,所以使用的内存会比多声道配置要少一些。

以下各节中提供了更多的详情:

参见