之前一直没有细研究过Unity的音频策略和优化机制,在此学习完过后作下笔记。
所谓音频采样率,即每秒采样多少次,人们常说的音频音质就是采样率。采样率越高,音质越好,大小越大。一般来说,CD的采样率/音质是44100HZ。
所谓音频采样精度,即每次采样的结果用多少位存储。最常见的是用16位,即2个字节来存储。
所谓音频采样时间,即音频的播放时间。
所谓音频声道,即采样的位置数量,从几个位置进行采样就是几声道。
所谓音频解码,即压缩音频的解压缩。音频必须解码之后才能进行播放。
所谓码率,即采样率 * 采样精度 * 通道数。
一个未压缩的音频大小在内存中所占 = 采样率 * 采样精度 * 通道数 * 采样时间 = 码率 * 采样时间
Unity支持以下四种音频格式:
.aif:苹果开发的一种音频格式。
.wav:Windows开发的一种音频格式。
.mp3:一种有损压缩音频格式。
.ogg:一种有损压缩音频格式。
Force To Mono:将多声道的音频在打包前强制混合成为单声道。为什么要强制混合成单声道呢?官方的解释是:混合的过程一般会产生更安静的信号,因此峰值归一化的信号给了更多调整音量大小的空间。但是我觉得更多的应该是极大程度上减少了音频文件的大小。试想一下,直接从双声道减少一个声道变为单声道,可以减少多少数据。
Normalize:在Force To Mono的混合过程中使用音频标准化。所谓的音频标准化可以参考wiki。
Load In Background:音频加载时将在单独的线程上延迟进行,不会阻止主线程。即异步加载音频,可能会导致播放音频出现细微的延迟。默认情况下是关闭的。
Preload Audio Data:音频会在加载场景之前进行加载。默认情况下是打开的。所以说,如果音频文件设置是Unity默认的状态,即打开Preload Audio Data,关闭Load In Background,那么当场景加载完成时,场景中所需要的音频文件就已经完全加载完成了。但是需要注意的是,只有Unity知道的需要用到的音频,也就是场景中引用到的音频,才能采取上述的预加载机制。对于那些没有进底包,放在AB包中动态加载的音频,Unity没法帮使用者自动加载。如果是关闭的状态,音频数据只有在调用播放接口前或者主动加载才会进行加载。
Ambisonic:环绕立体混响声,即开启3D音频。
PCM:无压缩,速度最快,适合小音频。
ADPCM:压缩率小,速度较快,适合需要大量播放的不追求品质的音频。
Mp3:压缩率较大,速度较慢。
Vorbis:压缩率大,速度最慢,适合中长音频。在Unity中可以自主调节压缩率。
Preserve Sample Rate:原始采样率。
Optimize Sample Rate:自动优化设置采样率。
Override Sample Rate:手动设置采样率。
Decompress On Load:整个音频文件加载到内存中后对其立即进行解压,最终内存占用为解压后的音频大小,即未压缩的音频大小。播放的时候没有延迟,但是一般来说,大音频文件由于未压缩版本占用内存过大,所以尽可能地减少对大音频文件应用此机制。
Compressed In Memory:整个音频文件加载到内存中后不立即进行解压,当音频播放的时候进行解压,最终内存占用的是压缩后的音频大小。但是相比上面一种机制来说,这种机制在播放时会有一丢丢延迟,解压速度不同,播放的延迟也就不同。所以说这种机制应用于大音频文件是比较合适的,既不会占用过多内存,又能接受解压带来的CPU开销和细微播放延迟。
Streaming:直读直放的模式。这种模式使用尽可能小的内存来缓存从磁盘中逐渐读取的数据,并且立刻解码播放音频,播放完后及时释放。但是这种模式的CPU开销是最高的,音频的播放延迟取决于频繁I/O的开销,所以说算是CPU换内存的一种方式。所以说,对内存压力比较大的项目,首选这种模式是不错的选择。除此之外,这种模式也比较适合大音频,或者只需要播放一次的音频。
如果没有必要使用多声道,请一定要勾选强制转换为单声道的选项,这会使得音频大小减少很多。
如果对音效质量要求没有那么高,那么采样率可以适当降低一点,压缩格式可以选择压缩率高的选项。
如果对播放延迟特别敏感,那么最好选择Decompress On Load机制,虽然内存占用会大一点,但是一般来说需要无延迟播放的音效都不会很大。可以接受延迟的话,就最好选择Compressed In Memory来减小内存开销。
虽然不太建议使用Streaming方式,如果项目的内存是主要问题的话,尝试使用Streaming方式用CPU换内存也是不错的选择。
待补充…
音频虽然在一个项目中看上去微不足道,但是音频优化确实还是有很多东西可以学习和了解的,比如对内存、对CPU等。
最近家里添了新成员,耽误了一会学习。
总之,学就完事了。
https://docs.unity3d.com/cn/2020.2/Manual/class-AudioClip.html
https://blog.csdn.net/chenfujun818/article/details/81710895