Unity性能优化—声音优化


目标给你一个关于在游戏中通过优化声音提高性能的建议   
为什么我的游戏加载时间那么长?
为什么播放游戏声音时延迟那么长?
为什么声音文件占那么多的内存?
为什么我一播放声音游戏就那么卡?
难道是因为我在开发时对声音的处理有问题
也许你在加载声音时都会出现以上的问题冲到你的脑门上!!
好吧,我知道这种感觉!!声音管理起来很棘手;当我开发第一个游戏的时候我也有遇到过相同的问题。我在网上任何地方都找不到原因和解决方案。所以我决定发布这篇文章,希望能帮助到你。
如果你是Unity初学者,首先需要弄清楚声音管理如何在Unity中工作的。
为此,你可以参照下面的链接,去了解一下Audio Clips、Audio Listeners、AudioSources的基本操作:https://unity3d.com/learn/tutorials/modules/beginner/audio/audio-sources-and-listeners
在Unity中的声音管理是非常简单和基本的,它是如何影响我的游戏呢?
   
· 是的,非常简单哦,但是它(声音管理)却能让你的游戏陷入困境!
· 让我们通过一个简单的案例去理解它吧。
   
步骤一:设置场景,如下所示:
创建一个Canvas,给它添加两个Button控件(一个名为Music-Button,另一个为Sound-Button)。

在Main Camera下创建一个空物体命名为AudioSources,且又在它下面再创建两个空物体分别命名为“BackgroundMusic”和“SFX-Sounds”。

然后创建一个空物体(Empty GameObject),并命名为“SoundManager”。(名字随你来)

在hierarchy中层次关系如下所示:


我的屏幕设置很简单,如下所示:


步骤二:创建一个脚本,如下所示:
using UnityEngine;
 
public class SoundManager : MonoBehaviour
{
   #region BACKGROUND_MUSIC
 
   public AudioClip[] backgroundMusicClipsArray;
   public AudioSource backgroundMusicSource;
 
   #endregion
 
   #region SFX_SOUNDS
 
   public AudioClip[] SFXSounds;
   public AudioSource SFXAudioSource;
 
   #endregion
 
   #region PUBLIC_METHODS
 
   public void PlayRandomMusic()
   {
       backgroundMusicSource.clip = backgroundMusicClipsArray[Random.Range(0, backgroundMusicClipsArray.Length)];
       backgroundMusicSource.Play();
   }
 
   public void PlayRandomSFXSounds()
   {
       SFXAudioSource.PlayOneShot(SFXSounds[Random.Range(0, SFXSounds.Length)]);
   }
 
   #endregion
}
在这里,对于背景音乐和SFX声音(SFX声音就是一点短的音频剪辑,如跳跃的声音(Biu)等)我声明了两个Audio Clip的数组,名字分别为:backgroundMusicClipsArray和 SFXSounds(分别用来存放对应的声音资源)。
也声明了两个AudioSource类型的成员变量(就是对应的“BackgroundMusic”和“SFX-Sounds”,记得把他们拖到脚本上哦)。
这里有两个名为PlayRandomMusic() 和PlayRandomSFXSounds()的方法,用于在我们调用该方法时播放随机音乐/声音。然后为对应的Button添加对应的响应事件。把AudioClips的设置全设为默认即可。
现在测试它在编辑器是否能正常工作。
步骤三:把发布平台设置为安卓平台
生成 Build 的时候记得把 Development Build 和 Auto Connect Profiler 勾选上,如下图所示:

在你手机上开始游戏,你有发现到什么奇怪的事情吗?

加载游戏花了多少时间?

对于我,从Unity的默认界面加载到游戏界面我大约花了10-15秒,我的游戏中大概有15个背景音乐和40个SFX声音片段。
现在,查看一下Profiler,在Profiler中找到Audio模块。如下图所示(下面第一张图是我自己弄得,怕大伙们找不到Audio模块。。)



现在观察“Total Audio Memory”的数据,我这里显示了147.7MB!!就声音资源就占了147.7MB的内存,这么说手机的RAM(随机存取存储器)小于521MB的就没得玩了??(233)
好吧,那我该怎么做呢?

放心伙计,总会有办法解决的!但这里的问题是,
“哪一个是最好的解决方案?”

让我们采取某些措施,并且继续我们的案例去获得答案
步骤一:在Audio Clips修改一些设置
要想更好的理解这一步,可以通过下面链接去了解AudioClips的设置

现在选择所有的背景音乐资源。
在Inspector中的设置将会如下图所示:


如上图所示,让我们取消Preload Audio Data(预加载音频数据)选项。然后把Override for Android选项勾上,并且设置Load TypeStreaming
“如果你已经阅读过上面链接里的内容,你可能已经知道我们为什么要这么做了。”
步骤二:准备Android Build
所有Building的步骤都和上面的一样。
你有看到什么不同嘛?
在我这边,我的游戏加载时间从15秒变为了2秒...!这将比原来的加载时间快了5-7倍啊~!!!
Note

不同的设备效果也许会不一样,这将取决于你的CPU和内存,在这里,我使用的手机型号是“Motorola MOTOG2”
现在让我回到Profiler中
你有发现什么改变吗?


Total Audio Memory居然从147.7MB降到了5.8MB!!这便优化了25倍的内存使用啊~!!!
噢,太神奇了!!但是为什么这样呢?


在案例中,我们禁用了预加载音频(Preload Audio Data),因此就没有必要在开始的时候加载所有的音频剪辑,这便减少了加载时间!这将会在需要用到音频的时候才会去加载它。
也许你现在会想,“一旦我加载和使用了所有的音频剪辑,它们会不会占用内存呢?”
你是否还记得我们把Load Type设置为Streaming,音频剪辑将放入缓存区中,并且从缓存区中播放,一旦播放完后,便被卸载掉,这便释放了内存。因此便优化了内存的使用。
你可能会有另一个问题,“为什么不为SFX声音做同样的操作呢?”
因为SFX声音在游戏运行中会经常使用到,因此会有一点小延迟是无关紧要的。事实上,我推荐将Load Type设置为Decompress on Load(在加载时解压)会运行的更流畅(并不是使用于任何的音频,只是使用于频繁使用的音频)。
无论如何,哪怕你有50个SFX Sounds,只要它不占用10-20MB的内存,那么还是可以接受的。
下图中显示了40个Load Type设置为Decompress on Load的SFX AudioClips的Total Audio Memory仍然为16MB,这对于我来说已经很不错了!!


这太有用了!!声音的优化是必须的啊!!
是的,这是必须滴。如果我们能适当的优化声音资源,我们为在游戏运行中其他重要的资源留下了大量的内存资源,这便创建了一个流程的手机游戏。所以适当的优化和设置是必须的。


展开阅读全文

没有更多推荐了,返回首页