音频方面

尽管 Unity 使用的打包格式 AssetBundle 一般情况下压缩率都很高,但是对于音频这样的信息熵很高的多媒体文件,常规的无损压缩很难减小它的体积。因此,对于较长的音频文件,如果想要大幅降低体积,必须使用合适的有损压缩方式。

压缩率的计算方式为:压缩后大小 / 压缩前大小,因此压缩率越小,压缩效果越好。

Unity 支持大多数常见音频文件,并且针对各种用例提供了不同的压缩、加载方式。Unity 将音频文件称之为 Audio Clip,而正确配置 Audio Clip 导入设置 非常重要!

取决于您的音频长度,错误的配置方式可能会严重影响你的模型大小,加载后的内存消耗以及播放时的 CPU 周期消耗

CPU 运行指令时需要消耗 CPU 时钟周期,用掉的 CPU 周期越多,任务管理器中显示的 CPU 占用率越高。

下面是一个 .wav 文件的典型的 Audio Clip 导入设置(此处提供简体中文和英文版本作为交叉对照):

图片.png图片.png

关于这些属性的详细解释,请参考 Unity 官方对于 Audio Clip 的文档

这些属性中,最重要的是以下几个选项:

如果决定进行 Android 平台的支持,可以类似贴图导入设置一样启用 Android 平台的覆盖设置(Override for Android),其属性基本一致,但是压缩格式额外增加了 MP3支持。由于 Vorbis 格式解压时 CPU 周期消耗相对较高,因此如果 PC 平台使用 Vorbis,推荐 Android 平台使用 MP3

至于其它属性,由于对模型体积以及性能消耗并不重要,因此这里简单介绍一下功能:

下面,我们将对压缩格式采样率加载类型两个属性进行深入的解释。


压缩格式

Unity 导入音频后将根据压缩格式将原始音频文件打包到最终的生成产物中。Unity 提供了以下几种压缩格式:

PCM
ADPCM
Vorbis
*MP3

音频质量是主观的,没有固定的标准,因此对于如何选取配置压缩质量,用户需要根据音频的类型自行平衡质量与体积。当然,也可以用最低质量换取最低的文件体积,只要你能接受压缩带来的音频质量损失

正确设置压缩格式不但影响音频体积,还会影响播放时的 CPU 周期消耗:ADPCM、Vorbis 和 MP3 在播放前必须被解压为 PCM 格式才能播放。取决于加载类型,错误的压缩格式配置可能会造成高 CPU 周期消耗或者高内存消耗!加载类型造成的影响将在后文中进行解释。

采样率设置

尽管现实世界的音频是连续的模拟量,但是存储为数字格式时需要转换为离散的数据格式,这一过程被称之为“采样”。采样率这一参数就是表示了音频文件的采样,其单位为 Hz,意为“每秒进行多少次采样”。

对于采样率,Unity 提供了三个选项:

类似压缩质量,采样率越低,体积越小,音频质量越差。

信息不能无中生有:设置为比原始音频文件更高的采样率不能提高音质,只能浪费更多的存储空间!


附录:不同压缩格式的参考压缩效果

原始音频为长度 02:26WAV 文件,内容为歌曲,采样率 48000 Hz,体积 26.8 MB

采样率只列出了部分情况;不包含 MP3 相关的数据。

由于 Vorbis 为可变比特率,因此不同音频内容的压缩率会有所不同,表格数值仅供参考

压缩格式
品质
采样率(Hz)
文件大小(MB)
PCM
N/A
48,000
26.8
ADPCM N/A 48,000 7.5

Vorbis

100
48,000 7.2
Vorbis 50
48,000 2.8
Vorbis 1
48,000 1.3
PCM N/A 22,050
12.3
ADPCM N/A 22,050 3.5
Vorbis 100
22,050 3.0
Vorbis 50
22,050 1.6
Vorbis 1
22,050 0.7

加载类型

压缩格式和采样率只影响文件体积和解码时的 CPU 周期消耗,加载类型决定了如何加载这些处理后的音频文件。尽管上文中已经解释了如何降低音频文件体积,但是仍然需要根据需求正确设置加载类型。

为什么需要正确设置加载类型?因为音频压缩不同于前一篇文章中提到的贴图格式压缩,显卡能够直接使用压缩后的贴图,音频必须在内存中被解压回 PCM 才能被播放。解压过程不但需要消耗 CPU 周期,还需要占用内存

由于音频压缩一般具有极低的压缩率,参考上文中的表格,质量为 1 的 Vorbis 在 48,000Hz 采样率下具有恐怖的 4.85% 压缩率,如果有大量低压缩比的音频文件被解压进内存,这会导致看似小体积的音频文件产生极高的内存消耗!在该情况下,上文中提到的 4.85% 压缩率的音频文件会在解压后从 1.3MB 膨胀 20.6 倍变为 26.8MB

音频文件解压为 PCM 后的体积不算在模型性能限制中的“未压缩大小”,未压缩大小只计算 AssetBundle 解压后大小。

除了可能的内存消耗,解压过程中消耗的 CPU 周期也不能被简单忽略。对于频繁播放的音效(例如脚步声等),如果使用高压缩率格式,如果每次播放都要进行解压,这会消耗大量的 CPU 周期,拖慢程序性能。

为了适应不同场景的需求,Unity 提供了如下几个加载类型:

加载时解压缩(Decompress On Load)
 压缩内存(Compressed In Memory)
流式处理(Streaming)

一定要根据自己的需求正确设置加载模式!不然你可能会面临高 CPU 周期消耗高内存消耗


总结

综上所述,对于不同类型的音频文件,建议使用以下配置:

音频类型 长度 播放频率 推荐压缩格式 推荐加载类型
长度短,不常播放的音频内容


任意

加载时解压缩或压缩内存

各种音效,如脚步声、交互声音 任意

加载时解压缩

质量需求低的音效,如爆炸、噪声 ADPCM 或任意

加载时解压缩

质量要求高,长度很长的音乐 Vorbis(或 Android 平台使用 MP3) 压缩内存
质量要求低,长且频繁播放的音频内容 ADPCM 压缩内存

除此以外,还应当根据具体的需求调整 Vorbis (或 MP3)的压缩质量以及采样率,以求在大小和质量中找到一个平衡点

当然,最重要的降低模型体积提高性能的方式仍然是:


Revision #15
Created 5 July 2024 20:21:38 by Hrenact
Updated 23 July 2024 10:46:49 by 代理猫咪