使用UWA分析项目发现音效资源后,又使用Unity profiler来分析项目中的audio资源发现,一个背景音乐和两个音效居然用了14MB的内存消耗,优化后降到了2MB. UWA分析结果: [ Force To Mono:力量单声道 如果启用,音频剪辑将向下混音为单声道声音。在向下混频后,信号被峰值归一化,因为下混频过程通常会导致比原始信号更安静的信号,因此峰值归一化信号通过AudioSource的音量属性为后续调整提供了更好的余量空间 Normalize:规范化 启用此选项后,在“强制为单声道”混音过程中,音频将被标准化。 Load In Background:在后台加载 如果启用,音频剪辑将在后台加载,而不会在主线程上造成停顿。这在默认情况下是关闭的,以确保场景开始播放时所有音频剪辑已完成加载的标准Unity行为。请注意,音频剪辑上仍在后台加载的播放请求将被延迟,直到剪辑完成加载。加载状态可以通过AudioClip.loadState属性查询。 Ambisonic:环绕声 Ambisonic音频源以一种格式存储音频,该格式表示可根据听众的方向旋转的声场。对于360度视频和XR应用程序非常有用。如果您的音频文件包含Ambisonic编码的音频,请启用此选项。
Default选项:
Override for android:减小安卓打包体积; Load Type: Streaming:流 动态解码声音。此方法使用最小量的内存来缓冲从磁盘逐渐读取并在运行中解码的压缩数据。请注意,解压缩发生在分析器窗口的音频面板的“Streaming CPU”部分中可监视其CPU使用率的单独流式线程上。注意:即使没有加载任何音频数据,流式片段也会有大约200KB的过载。
Decompress On Load:加载时解压缩 音频文件一经加载就会被解压缩。对较小的压缩声音使用此选项可避免即时解压缩的性能开销。请注意,在加载时解压缩Vorbis编码的声音比使用它压缩大约多十倍的内存(对于ADPCM编码大约是3.5倍),所以不要将此选项用于大文件。 Compressed In Memory:压缩在内存中 保持声音在存储器中压缩并在播放时解压缩。这个选项有一个小的性能开销(尤其是对于Ogg / Vorbis压缩文件),所以只能用于较大的文件,因为在加载时解压缩会使用大量的内存。解压缩在混音器线程上发生,并可在Profiler窗口的音频面板中的“DSP CPU”部分进行监视。 Preload Audio Data:预加载音频数据 如果启用,音频剪辑将在场景加载时预先加载。默认情况下,这反映了在场景开始播放时所有音频剪辑已完成加载的标准Unity行为。如果未设置该标志,音频数据将要么被上加载的第一个的AudioSource.Play()/ 的AudioSource .PlayOneShot(),或者它可以通过加载的AudioSource.LoadAudioData(),并通过再次卸载的AudioSource .UnloadAudioData()。 unity通常会对音频文件勾选〃Preload Audio Data”,勾选后音频文件会在 加载场景时全部加载,并保持在内存中,目的是节约实时加载的时间,避免音效延迟播放的现象, 但这意味着加载场景的时间变长,运行时内存占用也会变高。 降低音质后音频的体积变小,内存占用小,能够有效缓解以上两个问题。 在实际应用时,为了缩短Loading时间,降低内存占用,有的音频会直接选择取消勾选”Preload Audio Data”,等到要调用该音频文件时才实时读取。而降质后的音频小,读取率仍会有所提升。 小文件音频建议使用预加载,大文件音频建议使用将Load Type修改为 Streaming ,这样在播放完毕后会自动释放对应文件。 Compression Format:压缩格式
PCM :提供高品质但牺牲文件大小最适合使用在很短的音效上。
ADPCM: 这种格式适用于大量音效上如脚步爆破和武器,它比PCM小3.5倍但CPU使用率远低于Vorbis/MP3
Vorbis/MP3: 比PCM小但是品质比PCM低,比ADPCM消耗更多CPU。但大多数情况下我们还是应该使用这种格式,这个选择还多了个Quality可以调节质量改变文件大小
Unity3D游戏引擎一共支持4个音乐格式的文件
.AIFF 适用于较短的音乐文件可用作游戏打斗音效 .WAV 适用于较短的音乐文件可用作游戏打斗音效 .MP3 适用于较长的音乐文件可用作游戏背景音乐 .OGG 适用于较长的音乐文件可用作游戏背景音乐
增强音频性能:
1.尽量减少音频数量
因为每个 Audio Source的播放都会消耗一定量的cpu,所以我们可以控制场景中 Audio Source的数量来节省cpu。
一种方式是控制我们的音频来源,这种方式我们硬盘上 的AudioClip可以同时播放的数量和总共播放的总数进行节流控制。我们通常会做一个AudioPool做这些节流操作,这很适合2d声音和单实例的3d声音(3d声音在播放的时候 仍然要放在场景中具体的位置 )。 更甚至是移除一些音频,这种做法会影响到用户体验,我们应该在质量和性能上做权衡。
2.减少AudioClip引用
场景中每个Audio Source的Audio Clip引用和Preload Audio Data 启用都将消耗一定量的内存(压缩解压或者缓存),这些内存将贯彻整个场景,如果两个或两个以上的Audio Source引用相同的Audio Clip没有额外的内存消耗。Audio Clips在Unity中是非托管资源这意味着他们不会通过设置为null释放内存。
Unity希望我们能够加载和释放这些资源,经常使用的音效长久的在内存中保存文件是合理的,因为每次加载一个文件到
内存中都会消耗CPU。然而,如果我们发现因为音效而使用太多的内存的时候,我们必须做出艰难的选择是降低音频质量还是完全移除他们来节省内存。另一方面,保存不常用的音效在一个很长的场景中将会造成重大问题。
我们可能会有很多一次性音效,如对话片段,它们没有需 要长久保存在内存中。创建Audio Sources并分配一个AudioClip如果只是这样即使在游戏中只有一次使用也会导致内存消耗过剩,我们应该利用Resources.Load()和Resources.UnloadAsset()来保持需要播放的音频数据在内存中,一旦它不在需要就立即释放它。