Unity的AudioClip加载设置总结
基本来说就是翻译并记录一下官网对AudioClip的Manual文档说明:https://docs.unity3d.com/2017.4/Documentation/Manual/class-AudioClip.html。文档版本是2017.4。
Audio Clip
Audio Clips包含着被Audio Source使用的数据。Unity支持单声道、立体声/双声道,以及多声道(最高为8声道即7.1环绕声)的音频资产。Unity支持的音频格式为:.aif、.wav、.mp3和.ogg。Unity也可导入Tracker Modules文件,格式为.xm、.mod、.it和.s3m。Tracker Module资产和音频资产在Unity引擎中的表现方式一致,唯一区别是Tracker Module资产不会像音频资产那样在Inspector窗口中拥有一个波形预览图。
设置 Options
Force To Mono
勾选后,在打包游戏前,双声道多声道的音频资产都会被下混(术语,mix down)为单声道音频资产。
Normalize
勾选后,勾选了上述Force To Mono的音频在下混时,会被标准化(Normalized,搜索Audio Normalization)。
Load In Background
勾选后,该音频资产的加载,会在一个独立线程上、延迟一段时间后开始,加载不会阻塞主线程。
Ambisonic
Ambisonic音频资产,将音频数据存储在一种具有声场(SoundField)的音频格式中,这种声场能让音频随着监听者的旋转而旋转。可见这适用于360°全景视频和VR/XR应用中。如果你的音频文件包含这种Ambisonic编码的音频资产,就勾选这个选项告诉Unity。
后面的属性顺序稍微换一下,先写压缩格式设置。
压缩格式 Compression Format
该选项设置的是,在程序运行时,Unity对音频资产使用的压缩方式。需要知道的是,这个选项的具体选项内容取决于你当前选中的Build平台。
PCM:这个选项压缩得到高质量音频,代价是文件体积巨大,所以更适合很短的音效音频;
ADPCM:此格式适用于包含大量噪音且需要大量播放的声音(例如脚步声、撞击声、武器声音)。较于 PCM,ADPCM压缩能力提高 3.5 倍,但 CPU 使用率远低于 MP3/Vorbis 格式,因此成为上述声音类别的最佳压缩方案;
Vorbis/MP3:与 PCM 音频相比,Vorbis压缩会得到更小的音频文件但质量有所降低。可通过 Quality 滑动条来设置压缩量。这个格式最适合中等长度的音效和音乐音频;
(其它就是平台专属的一些格式了,比如HEVAG是PSVita独有格式,其效果类似ADPCM)
加载方式 Load Type
该选项设置的是,在程序运行时,Unity加载音频资产的方式。
Decompress On Load:音频文件会在它们被加载后尽可能快地解压。建议对较小的压缩音频设置该选项,避免匆忙解压造成的性能消耗。注意:对Vorbis压缩方式的音频使用此选项,相较于Compress In Memory加载方式,会额外造成10倍的内存开销。对ADPCM而言这一差别则是额外3.5倍,所以,不要对大文件使用该选项。
Compressed In Memory:让音频在内存中保持压缩,只在播放时才解压。这个设置会造成一点点的性能开销(特别是对于Ogg/Vorbis压缩格式的文件),所以只在那些采用DecompressOnLoad格式会带来不可忍受的内存开销的大音频文件上设置该选项。解压过程在mixer线程中进行,可以在Unity Profile(Ctrl+7)的音频部分的DSP CPU那项上看见CPU小号。
Streaming:匆忙地解码音频。这个加载方式使用最少的内存去缓冲逐渐从硬盘上读取到的压缩数据并解码。注意:这一解压过程在单独的streaming线程上进行,其CPU消耗可以在上述窗口的Streaming CPU部分监控到。同时注意:即使没有加载任何音频数据,该加载方式也会有大约200KB的负载量。
采样率设置 Sample Rate Setting
Preserve Sample Rate:保持音频原有采样率;
Optimize Sample Rate:自动地根据检测到的音频中的最高频内容动态地调整采样率;
Overrde Sample Rate:手动覆盖采样率,可用此选项来抛弃一些频段的内容。
最重要但是放在最后的东西来了。真的离谱,官方文档把这说明放在最后。
导入音频资产 Importing Audio Assets
Unity可以读取很多源文件格式。但无论何时导入一个外部文件,它都会被转码为适合构建对象的格式和音频。(就是说,比如导入一个ogg文件,Unity内压缩格式设置为PCM,程序运行时,也会先被解码然后再按PCM编码导入到内存中)这可通过上述的Compression Format调整。
通常,PCM和Vorbis/MP3适合将声音保持为接近其原貌。PCM需要很少的CPU消耗,因为音频是未压缩的所以可以直接通过在内存中读取获得。Vorbis/MP3允许通过调节Quality滑动条减小音频信息的丢失。(真的nmd和前面的东西自相矛盾啊)
ADPCM 是内存和 CPU 使用率之间的折衷方案,因为它仅使用比未压缩 PCM 选项略多的 CPU,但产生恒定的 3.5 压缩比,与使用 Vorbis 或 MP3 可实现的压缩相比,压缩能力通常是其 1/3。此外,ADPCM(如 PCM)允许自动优化或手动设置要使用的采样率,在声音的频率内容可接受的质量损失范围内,可进一步压缩打包声音资源的大小。
模块文件(.mod、.it、s3m 和 .xm)可以提供极高的质量,但体积却极小。使用模块文件时,除非有特别需求,否则请确保将 Load Type 设置为 Compressed In Memory_,因为如果将其设置为 Decompress On Load_,那么整首歌曲都将被解压缩。这是 Unity 5.0 中的一种新行为,允许对这些类型的剪辑使用 GetData/SetData,但音轨模块的一般和默认用例是将它们压缩在内存中。
一般经验法则,压缩过的音频(或模块)最适合长音频文件(如背景音乐或对话),而 PCM 和 ADPCM 更适合包含一些噪音的短音效,因为 ADPCM 的瑕疵在平滑信号上太明显。您应该使用压缩滑动条来调整压缩量。从高压缩开始,逐渐将设置降低至可感知到音质损失的程度。然后,再稍微增加,直到感知到的质量损失消失。
写个我的实践总结吧。
① Unity会把所有我们给它的音频文件,转码为Unity内部的某种文件,这种转码后的格式设置就是Compression Format。根据这篇文章,这应该是一种叫做资源管道之类的资源策略。
② 设置为PCM编码后点击Apply,得到的Import Size,就是Unity内部文件解压后的大小。这个PCM,是针对Unity自己的“原生”中间文件而言的。
可能有点绕,这么说吧,这是我自己实践的步骤:我们给Unity某音频文件A,A在我们电脑上格式为ogg,在我们电脑上大小是4MB。
然后,在Unity的AudioClip里,假设Unity生成的内部中间文件为B。
我们把Compression Format设置为PCM,得到Unity显示其ImportSize为16MB。那么,这个16MB,就是Unity的中间文件B解压后的大小。
“解压后的大小”,意思就是说,如果我们把Compression Format设置为Vorbis或者ADPCM,得到的ImportSize也分别变为比如4MB和5MB,但是,如果我们的Load Type选择为“Decompress On Load”,在Unity的Profiler的音频窗口部分我们也会看到,音频的Memory仍然为占用了16MB。也就是我们设置为PCM时的Import Size。
这也就促进我们理解了,Decompress On Load,就是在加载这个文件后,把它在内存中完全地解压。播放这个文件时,CPU就只需要在内存中取数据,而不再需要解压步骤。所以:对于同一种Comperssinon Format设置而言,采用Decompress On Load方式加载的音频clip,CPU占用率低,但内存占用高。
而Compressed In Memory,则是把压缩的中间文件B放在内存。这就导致播放这个文件时,CPU需要在内存中取数据然后解压,但内存就不用放完全解压的数据了。所以:对于同一种Comperssinon Format设置而言,Compressed In Memory方式加载的音频clip,存在一定的CPU占用,但内存占用没那么高。
Streaming,则完全不把中间文件B放入内存,它让中间文件B就存储在硬盘上,内存只用很小一部分存储每次读取到的硬盘来的数据供CPU使用。这样,播放这个文件时,CPU需要去联系磁盘、去内存调用、去解压,CPU的占用达到了三种加载方式的顶峰。而内存占用,却只需要一丁点,按照官方文档而言,通常就是200KB左右,来保存每次从磁盘取到的一块数据就行了。内存占用为三种加载方式中最小的。
③ 对于同样是Decompress On Load,不管我们的压缩模式选的是什么,CPU的占用都很低,但内存会随中间文件B解压后的ImportSize大小增高和降低,这个解压后的值可以用PCM模式下的ImportSize大小去大致反推估算;
对于同样是Compressed In Memory,其CPU占用与解压缩难度有关,我们选择的压缩格式的压缩程度越大,CPU解压的占用就越高,比如解压Vorbis就比解压PCM和ADPCM要累所以占用高。而内存会随中间文件B的ImportSize大小增高和降低;所以,在PCM模式时,该加载方式拥有最低的CPU占用和最高的内存占用;在Vorbis/MP3压缩模式时,该加载方式拥有最高的CPU占用和最低的内存占用;而ADPCM压缩模式下,该加载方式的CPU占用和内存占用位于两者之间。
对于同样是Streaming,其CPU占用因为同样设计解压缩,变化关系大致如上。而内存占用却只会维持在200K左右不随压缩模式而改变。