音频资源标准和优化建议

日期 修改人 修改内容 版本
2021年10月19日 林七佛 创建 V0.1
2021年10月20日 林七佛 修订 V0.11

★为开发需要注意的,☆为美术需要注意的

音频资源标准(降低采样频率可以减小文件和运行时内存)

音频参数
标准
采样频率 22,050HZ(广播音质-默认选用)、44,100HZ(CD音质)
采样精度 16bits(CD)
声道 单声道
  • ★音效的采样频率默认选择22,050HZ,44,100HZ可用在背景音乐上
    上述可以在Unity中 Import Settings 进行设置,不作为原始文件资源标准

    由于实验室使用的音频文件多样性,很难拍脑袋决定一个标准的采样频率。因此在优化音频文件时,需要多花一些时间在真机上进行测试。

  • ☆音频编码格式统一为MP3
    一般来说,PC端使用OGG格式更好,而移动端则首选MP3,不过为简单起见,统一为MP3。
    如果要保证最好的音质,推荐使用WAV或者AIFF无损压缩格式。
    不过在实验室项目中,目前应该没啥必要。

  • ☆注意音频文件的版权。
    发现较多音频文件来自【站长素材】网站,存在侵权风险!!!
    侵权风险说明截图

快速优化建议(在Unity中的音频资源文件的Import Setting面板中设置)

Unity编辑器-音频文件-导入设置

PC和移动端平台需要分别设置

  • ★Force To Mono 即强制单声道
    建议启用,可节省一半内存和磁盘空间
    PS:设置成Mono后要在真机上试听效果,有问题请联系资源提供者(通过音频编辑软件只导出左或右声道的声音)。

  • ★Normalize (Force to Mono 激活时可用)
    一般是建议启用的。调整AudioClip的增益,使现在的单声道声音与原始立体声文件的音量相同

  • ★Load in Background(影响内存)
Load in Background Preload audio data 结果
启用 启用 当场景加载时,带有此设置的AudioClips开始加载,但不会停止主线程。如果在场景加载时它们还没有全部完成加载,它们将在场景播放时继续在后台加载。如果一个尚未加载的声音被触发,它的行为将与禁用预加载的行为相同(见下面)。
启用 禁用 当声音第一次被触发时,它将在后台加载,并在它准备好时立即播放。如果文件很大,这将导致触发和播放之间有明显的延迟
禁用 启用 在加载场景的同时加载音频。场景将不会开始,直到所有与此设置的声音加载到内存中。
禁用 禁用 当声音第一次被触发时,它使用主线程将自己加载到内存中——如果文件很大,可能导致卡顿问题。仅推荐对非常小的文件使用此配置,同时要注意在同一时刻没有大量播放这种文件,否则会严重影响性能。

优化建议:

  • 小文件(各种音效)可使用第二个选项
  • 大文件(如背景音乐)使用第一个选项

  • ★Ambisonic(环绕立体声)
    一般在VR/AR、360视频场景下使用。
    启用时勾选,默认值是不勾选。

  • ★Load Type 选择【敲黑板!这个影响CPU和内存】
选项值
描述
适用范围
Decompress On Load 音频数据是解压的,以完整的原始大小存储在内存中。最费内存,最省CPU 适用于小型音频文件(< 200kb)
Compressed In Memory 声音数据将以压缩的形式保存在内存当中,在运行时解压,以内存换CPU(就是省点内存,费点CPU) 适用于中型音频文件(>= 200kb)和频繁使用的
Streaming 音频直接从磁盘流出,完全不进入RAM。这将使用一些磁盘吞吐量和CPU,但在PC/主机上,只要同时有不超过两个声音流,它就不会对性能产生巨大影响。在移动设备(特别是低端和旧设备)上,同时流播放多个立体声音频文件会对CPU使用造成很大的影响 适用于单实例播放的大型音频文件,例如背景音乐或环境音效(>1M)。将使用最少的内存,以最高的CPU负载为代价。

哪种Load Type 提供最好的性能? 请看下图的对比:
哪种Load Type提供最好的性能?
总体说来,就是要么费CPU,要么费内存。因此在通常情况下,按照上面的表格的【适用范围】来进行操作。

参考链接:匹配正确的加载类型和正确的压缩格式


  • ★Preload Audio Data【内存相关】
    启用则音频文件会在场景加载时被预加载,占用内存,默认是启用的。
    较大音频文件(如背景音乐),设置Load Type为Streaming,会自动反选此选项。
    注:当需要提高场景加载速度和节省内存时,可反选此选项。
    不过这么做可能在加载较大音频资源时会有延迟,更改后需要留心测试。

此外,根据需要加载和卸载音频资源(Unity不会自动释放AudioClip的资源),可以优化内存使用,核心代码如下:
audioClip.LoadAudioData();\\此操作会阻塞主线程,勾选Load In Background就会采用异步方式加载,就不阻塞主线程了。
audioClip.UnloadAudioData();


  • ★Compression Format 编码压缩格式选择
    iOS 使用ADPCM或MP3格式
    Android使用Vorbis格式

    此选项的ImportedSize数值将影响程序包的大小,对运行时的内存无影响,占用内存可在Profiler中查看)


  • ★Quality 音质压缩质量
    默认是100,一般推荐使用70%(在音质可以接受的情况下,自然是越小越好)

    上述影响音频效果的更改必须在设备上测试,在开发环境下测试是无效的。


  • ★Sample Rate Setting
    选择Override Sample Rate
    这里可以设置音频的采样频率,推荐使用Optimise选项

Profiler 调试

①. 在Profiler中开启Audio栏
1:在Profiler中开启Audio栏

②. 主要关注的指标
主要关注的指标

  • Total Audio Source:总资源数
  • AudioClipCount:缓存的音频数量
  • AudioVoices:当前播放的音频个数
  • TotalAudioMemory :实际占用的内存大小
  • Total Audio CPU,Streaming CPU :CPU的消耗

③. Detailed 视图
可以看到更多有用的信息,如关联的游戏对象、音频剪辑名称等
Profiler-Audio-Detailed

高级优化技巧

  • ★【TO-DO 待优化】静音时建议在内存中卸载音频相关的来源或是内存中的音频文件,将AudioSource组件Disable,同时有个上层管理系统负责过滤和音频相关的API调用。
    PS:即使删除了音频源组件或销毁了整个游戏对象,加载的音频剪辑仍然会存储在内存中。

    详见:[静音操作优化]

  • ★手动暂停未使用的Audio Source
    此优化适用于较大的场景,当用户离音源较远且听不到该声音时。
    目前实验室没有大场景,故可忽略。

    详见:手动暂停未使用的Audio Source-4. Manually pause unused Audio Sources

  • ★音频池技术
    在Unity Asset Store上的众多音频管理插件都会有某种类型的音频限制功能,此功能通常称为音频池技术。此技术的根本目的是以最低的质量成本实现最佳的性能。音频池技术较为复杂,一般不推荐自我实现。

    目前实验室的场景规模有限,一般不需要此技术加持。这块主要应用在规模较大的开放场景中,未来在元宇宙世界中,就必须用到相关的技术。总体上,现在我们关注场景中的音频源的数量,保证禁用场景中冗余的音频源即可。


其他

  • ★压缩格式-关于音频原始文件使用有损压缩格式的失真问题
    总是确保要导入到Unity中的音频文件是未压缩的格式,如WAVE (.wav)或AIFF (.AIFF)。许多压缩格式是有损的,这意味着当它们被编码时信息会丢失。如果你导入一个压缩文件,如MP3或Vorbis到Unity中,Unity会首先将其解码为未压缩的格式,然后重新编码为任何你选择的格式——即使它是与你开始时相同的格式。这可能会引入更多的压缩失真(compression artifact),这通常是不可取的。
    PS:上述建议在目前没有明确影响的情况下不列入标准,仅用于备忘记录!

  • ★如何设置2D音频?(Unity 2019.4版本)
    将Audio Source上的Spatial Blend属性拖到最左侧