前言

这里是前言介绍。

正文

没想到 Unity 的音频会成为内存杀手,在实际的商业项目中,音频的优化必不可少。

  1. Unity 支持许多不同的音频格式,但最终它将它们全部转换为首选格式。音频压缩格式有 PCM、ADPCM、Vorbis,不是所有平台都支持这些所有的压缩格式,有些平台,例如 WebGL 只支持 AAC 格式。

  2. 所有音频导入时,默认两项设置,LoadType 是 “Decompress On Load”,压缩格式是“Vorbis”,例如下图原始文件大小计算为 35.9 MB,导入的大小计算为 10.7 MB。这意味着这个音频剪辑将使您的游戏(存档)大小增加 10 兆字节,但播放它需要近 36 兆字节的 RAM。

These are default import settings.

3.Load Type 的各个选项

  • Compressed In Memory – 音频剪辑将存储在 RAM 中,播放时将解压缩,播放时不需要额外的存储。

  • Streaming –音频永久存在设备上(硬盘或闪存上) ,播放流媒体方式. 不需要 RAM 进行存储或播放。

  • Decompress On Load – 未压缩的音频将存储在 RAM 中。这个选项需要的内存最多,但是播放它不会像其他选项那样需要太多的 CPU 电源。

       怎么选?长音频播放消耗大量内存,如果播放时不想在内存中进行解压,有两个选择:
    
       (1)Load Type 选“Streaming”, Compression Format 选”Vorbis",使用最少的内存,但需要更多的 CPU 电量和硬盘 I/O 操作;
    
       (2)Load Type 选 “Compressed In Memory”, Compression Format 选”Vorbis",磁盘 I/O 操作被替换成内存的消耗,请注意,要调整“Quaility” 滑块以减小压缩剪辑的大小,以交换音质,一般推荐 70% 左右。
    
           一般是看到底音乐占据多少内存以及你的目标机型是什么样子的,如果音乐占据的内存本身比较高,你的目标机型的内存又比较小,那么就选择第二种,这种方案会卡一点,否则选择第一种就更好
    
  1. 声音特效

    (1)对于经常播放的和短的音频剪辑,使用 “*Decompress On Load” 和“PCM 或 ADPCM” 压缩格式 *。当选择 PCM 时,不需要解压缩,如果音频剪辑很短,它将很快加载。你也可以使用 ADPCM。它需要解压,但解压比 Vorbis 快得多。

    (2)对于经常播放,中等大小的音频剪辑使用”Compressed In Memory“ 和”ADPCM“压缩格式,比原始 PCM 小 3.5 倍,解压算法的 CPU 消耗量不会像 vorbis 消耗那么多 CPU。

    (3)对于很少播放并且长度比较短的声音剪辑,使用”Compressed In Memory”, ADPCM 这种压缩格式, 原因同(2)。

    (4)对于很少播放中等大小的音频,使用”*Compressed In Memory“ * 和 Vorbis 压缩格式。这个音频可能太长,无法使用 adpcm 存储,播放太少,因此解压缩所需的额外 CPU 电量不会太多。

现象:

一个 2MB 的音频文件,在内存中却变成了 20+MB

研究:

音频加载有多种模式: 造成这种现象是因为选择了 Decompress On Load 这种模式。

为什么会造成这种现象呢?这就要学习一下 unity 的音频的导入选项了。

一、LoadType

  1. Streaming: 流

动态解码声音。此方法使用 == 最小量的内存 == 来缓冲从磁盘逐渐读取并在运行中解码的压缩数据。请注意,解压缩发生在分析器窗口的音频面板的 “Streaming CPU” 部分中可监视其 CPU 使用率的单独流式线程上。注意:即使没有加载任何音频数据,流式片段也会有大约 200KB 的过载。

  1. Decompress On Load: 加载时解压缩(适用于小音效)

音频文件一经加载就会被解压缩。对较小的压缩声音使用此选项可避免即时解压缩的性能开销。== 请注意,在加载时解压缩 Vorbis 编码的声音比使用它压缩大约多十倍的内存(对于 ADPCM 编码大约是 3.5 倍)==,所以不要将此选项用于大文件。

  1. Compressed In Memory: 压缩在内存中

保持声音在存储器中压缩并在播放时解压缩。这个选项有一个小的性能开销(尤其是对于 Ogg / Vorbis 压缩文件),所以 == 只能用于较大的文件 ==,因为在加载时解压缩会使用大量的内存。解压缩在混音器线程上发生,并可在 Profiler 窗口的音频面板中的 “DSP CPU” 部分进行监视。

  1. Preload Audio Data: 预加载音频数据

如果启用,音频剪辑将在场景加载时预先加载。默认情况下,这反映了在场景开始播放时所有音频剪辑已完成加载的标准 Unity 行为。如果未设置该标志,音频数据将要么被上加载的第一个的 AudioSource.Play()/ 的 AudioSource .PlayOneShot(),或者它可以通过加载的 AudioSource.LoadAudioData(),并通过再次卸载的 AudioSource .UnloadAudioData()。

总结:小文件音频建议使用预加载,大文件音频建议使用将 Load Type 修改为 Streaming , 这样在播放完毕后会自动释放对应文件。

二、Compression Format: 压缩格式

  • PCM :提供高品质但牺牲文件大小最适合使用在很短的音效上。
  • ADPCM: 这种格式适用于大量音效上如脚步爆破和武器,它比 PCM 小 3.5 倍但 CPU 使用率远低于 Vorbis/MP3
  • Vorbis/MP3: 比 PCM 小但是品质比 PCM 低,比 ADPCM 消耗更多 CPU。但大多数情况下我们还是应该使用这种格式,这个选择还多了个 Quality 可以调节质量改变文件大小 (Quality 测试 1 和 100 对内存影响并不大)

三、音道

强制音效用单声道
只有少数的手机装置真的有立体声喇叭,而将音效强制设定为单声道能让内存的消耗减半。就算游戏会输出部份的立体声,有些单声道像是 UI 音效还是可以开启这个选项。

详细策略见下面这篇文章,具体的工具实现已上传github

参考

Unity 性能优化 - 音频设置
Unity 音频优化总结


to be continued…