音频方面
尽管 Unity 使用的打包格式 AssetBundle 一般情况下压缩效果都很好,但是对于音频这样的信息熵很高的多媒体文件,常规的无损压缩很难减小它的体积。因此,对于较长的音频文件,如果想要大幅降低体积,必须使用合适的有损压缩方式。
压缩率的计算方式为:压缩后大小 / 压缩前大小,因此压缩率越小,压缩效果越好。
Unity 支持大多数常见音频文件,并且针对各种用例提供了不同的压缩、加载方式。Unity 将音频文件称之为 Audio Clip,而正确配置 Audio Clip 导入设置 非常重要!
取决于您的音频长度,错误的配置方式可能会严重影响你的模型大小,加载后的内存消耗以及播放时的 CPU 周期消耗!
CPU 运行指令时需要消耗 CPU 时钟周期,用掉的 CPU 周期越多,任务管理器中显示的 CPU 占用率越高。
下面是一个 .wav 文件的典型的 Audio Clip 导入设置(此处提供简体中文和英文版本作为交叉对照):
关于这些属性的详细解释,请参考 Unity 官方对于 Audio Clip 的文档。
这些属性中,最重要的是以下几个选项:
- 后台加载(Load In Background):如果加载类型(Load Type)选择
加载时解压缩(Decompress On Load),则 VRChat SDK 要求必须启用后台加载。 - 加载类型(Load Type):决定 Unity 对 Audio Clip 的加载行为,后文会详细解释该选项。
- 压缩格式(Compression Format):配置 Unity 打包该音频文件时使用什么格式压缩。取决于 Audio Clip 的长度及其播放频率,应该视情况设置,以均衡文件大小及 CPU 周期消耗,后文会详细解释该选项。
- 质量(Quality):当使用有损压缩格式(Vorbis,或 Android 平台时可以使用 MP3)时用于设置压缩后的音质。质量越低,压缩后的体积越小,相应的音频质量也会更低。
- 采样率设置(Sample Rate Setting):采样率越低,音频文件越小,相应的音频质量也会更低,后文会详细解释该选项。
如果决定进行 Android 平台的支持,可以类似贴图导入设置一样启用 Android 平台的覆盖设置(Override for Android),其属性基本一致,但是压缩格式额外增加了 MP3支持。由于 Vorbis 格式解压时 CPU 周期消耗相对较高,因此如果 PC 平台使用 Vorbis,推荐 Android 平台使用 MP3。
至于其它属性,由于对模型体积以及性能消耗并不重要,因此这里简单介绍一下功能:
- 强制变为单声道(Force To Mono):打包时将多声道音频缩减为单声道
- 全景声:用于 360° 视频和 XR 视频等支持,一般不需要勾选
- 预加载音频数据:Unity 场景加载后会加载该 Audio Clip,但是对于模型上传而言似乎并不重要,VRChat Avatar SDK 也并没有强制要求进行设置,一般打开即可。
下面,我们将对压缩格式、采样率和加载类型两个属性进行深入的解释。
压缩格式
Unity 导入音频后将根据压缩格式将原始音频文件打包到最终的生成产物中。Unity 提供了以下几种压缩格式:
PCM
- 原始的音频数据,完全不需要任何处理可以直接被播放,体积最大,但是播放时不需要解压,CPU 周期消耗最低。
- 适用于短、播放频繁的音频类型,如脚步声、撞击声、武器声音等。
ADPCM
- 一种有损压缩格式,由 PCM 进行差分编码压缩得来,体积固定为 PCM 的 27 % ,播放时解压的 CPU 周期消耗低。
- 由于 ADPCM 的编码特性,不同音频内容的压缩效果不一,一般而言,高频率的音频内容 使用 ADPCM 的压缩质量相对较差,因此如果使用 ADPCM,因此应当始终检查 ADPCM 压缩后的音频质量。
- 适用于短、播放频繁且对音质要求不高的音频类型,如噪声,爆炸声等。
Vorbis
- 一种有损压缩格式,通常使用 Ogg 作为容器,称之为 Ogg Vorbis。压缩率优秀,体积最小,播放时解压的 CPU 周期消耗最高。
- 使用 Vorbis 时,可以修改质量(Quality)数值来平衡压缩率与体积:
- 质量越高,体积越大,音质越好;
- 质量越低,体积越小,音质越差。
- 需要注意的是,Vorbis 只能进行可变比特率编码,这意味着不同音频内容的压缩率会有所不同。
- 适用于长、播放不频繁的音频类型,如音乐、歌曲等。
*MP3
- 一种有损压缩格式,仅在 Android 平台可用,类似 Vorbis,压缩率较 Vorbis 更低,但是播放时解压的 CPU 周期消耗相对 Vorbis 较小。
- 可以作为 Android 平台上 Vorbis 的替代。
- 不支持无缝循环。
音频质量是主观的,没有固定的标准,因此对于如何选取配置压缩质量,用户需要根据音频的类型自行平衡质量与体积。当然,也可以用最低质量换取最低的文件体积,只要你能接受压缩带来的音频质量损失
正确设置压缩格式不但影响音频体积,还会影响播放时的 CPU 周期消耗:ADPCM、Vorbis 和 MP3 在播放前必须被解压为 PCM 格式才能播放。取决于加载类型,错误的压缩格式配置可能会造成高 CPU 周期消耗或者高内存消耗!加载类型造成的影响将在后文中进行解释。
采样率设置
尽管现实世界的音频是连续的模拟量,但是存储为数字格式时需要转换为离散的数据格式,这一过程被称之为“采样”。采样率这一参数就是表示了音频文件的采样,其单位为 Hz,意为“每秒进行多少次采样”。
对于采样率,Unity 提供了三个选项:
- 保持采样率(Preserve Sample Rate):使用原始音频文件的采样率
- 优化采样率(Optimize Sample Rate):让 Unity 根据音频文件内容自行设置一个合适的采样率
- 覆盖采样率(Override Sample Rate):手动设置采样率
类似压缩质量,采样率越低,体积越小,音频质量越差。
信息不能无中生有:设置为比原始音频文件更高的采样率不能提高音质,只能浪费更多的存储空间!
采样率越高,Unity 的 DSP 负载越高。
附录:不同压缩格式的参考压缩效果
原始音频为长度 02:26 的 WAV 文件,内容为歌曲,采样率 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)
- 使用此选项,Unity 将在加载模型时将音频解压为 PCM。这样当音频播放时不需要进行额外的解压操作,每次播放时 CPU 周期消耗最低,但是由于 PCM 体积非常大,如果音频很长,这会导致极高的内存占用。
- 适用于需要频繁播放且长度短的音频内容,如频繁触发的音效,脚步声,枪械声等。
压缩内存(Compressed In Memory)
- 使用此选项, Unity 将在加载模型时将压缩后的音频内容保持压缩状态,播放时再动态解压缩为 PCM。需要注意的是,Unity 并不会在第一次播放后将音频解压缩为 PCM 并替换掉原始的压缩的内容,而是每次播放时都要消耗 CPU 进行解压。作为好处,如果有很多的音频文件,这会极大地降低音频文件的内存占用。
- 适用于不会经常播放且长度较长的音频内容,如歌曲,舞蹈的配乐等。
流式处理(Streaming)
- 音频文件不会被读入内存,而是在播放时动态地从硬盘上读入内存,具有最低的内存占用,但有着三种加载类型中最高的 CPU 周期消耗。而且在大多数操作系统上,能同时打开的文件数量是有限的,这会限制该功能的使用。
- 对于 Avatar 而言,任何时候都不推荐使用该加载类型!
一定要根据自己的需求正确设置加载模式!不然你可能会面临高 CPU 周期消耗及高内存消耗。
总结
要选择合适的音频导入配置,应当按照需求做出性能和内存消耗的取舍:
一、尽量使用加载时解压缩(Decompress On Load)以获得最好的性能,但必须注意内存消耗。
如果使用加载时解压缩(Decompress On Load),不要以为 Vorbis 体积小就不会消耗大量内存,因为所有压缩格式都必须解压为 PCM 播放!如果你有大量的音频文件要使用,请考虑选择压缩内存(Compressed In Memory),或者不要添加太多音频文件。
二、如果不得不使用压缩内存(Compressed In Memory)请考虑播放频率,因为解压 Vorbis 会消耗 CPU 周期。
ADPCM 的解压性能相对 Vorbis 好得多,如果对音质要求不高而且想要比 PCM 更好的压缩率,也可以选择使用 ADPCM
你真的要随身携带 30 分钟的演唱会 CD?你也不想用 Soundpad?好吧,如果你真的要坚持,你应该选压缩内存(Compressed In Memory)并使用 Vorbis 压缩格式。
三、无论如何 Avatar 都不应该使用流式处理(Streaming)。
这会导致 CPU 和 I/O 的双重消耗,如果没有特殊需求绝对不应该选这个。
四、应当根据具体的需求调整 Vorbis (或 MP3)的压缩质量、采样率或压缩格式以求在打包大小和音频质量、CPU性能中找到一个平衡点。
如果使用加载时解压缩(Decompress On Load),压缩格式只影响 Avatar 打包大小
如果使用压缩内存(Compressed In Memory),压缩格式会影响 CPU 性能
采样率也会影响 Unity 的音频解码性能,即采样率越高,DSP load 越大。
你的音频文件原始格式与 Unity 导入格式无关,Unity 会依据导入设置进行二次压缩/或解压为 PCM。
五、最重要的降低模型体积提高性能的方式仍然是:
不要添加太多音频文件
如果可能,拆分为多个 Avatar 上传


No comments to display
No comments to display