为什么我的游戏加载时间这么长?
为什么在播放游戏音效的时候会有这么大的一个延迟?
为什么游戏音效文件会占据这么多的内存?
为什么在播放游戏音效的时候,会在游戏中出现一些延迟?
我是否没有正确处理游戏音效?
如果你刚接触Unity,你需要首先了解下Unity里面的声音管理是如何工作的。
- https://unity3d.com/learn/tutorials/modules/beginner/audio/audio-sources-and-listeners
Unity中的声音管理是非常简单和基本的,那么它是如何影响我的游戏的呢?
是的,它很简单,但是它能让你的游戏变得瘫痪!
为了理解上面所说的内容,让我们举一个简单的例子。
第一步 按照如下的方法设置场景:
· 生成一个带两个按钮的画布(一个按钮是MusicButton,另外一个是SoundButton)。然后在场景中加入两个声音源。然后加入一个新的游戏物体,命名为SoundManager。(当然你也可以根据你的需要来对它进行命名)。
按照下面的结构设置层次关系:
我的场景设置就像上图展示的这样简单(这仅仅是为了给你一个概念):
第二步 按照如下的方法设置脚本:
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
}
在这里我使用两组声音剪辑,分别命名为backgroundMusicClipsArray和SFXSounds,一个对应背景音乐,一个对应特效的声音文件。
同样的也有声音源。
现在,当调用的时候,PlayRandomMusic和PlayRandomSFXSounds将会播放随机的背景音乐/音效。这些方法按照自己的名字链接到场景中对应的按钮上。然后所有声音剪辑的设置按照默认进行设置。
现在测试下它们在编辑器里面是否能够正常工作。
第三步 准备进行一个安卓构建:
生成安卓构建,并且别忘了选上“开发版本的构建”和”自动连接调试器”。
- “在你的手机上启动游戏。你注意到有什么奇怪的事情了么?”
- “大概需要花多少时间来加载游戏?”
在我的例子中,它花费了大概10-15秒钟的时候才从Unity的默认开机画面加载完!我有大概15首背景音乐剪辑以及大概40首特效声音剪辑。
现在检查下分析器,看看分析中的声音音效部分。
查看下“总的声音文件所占的内存”,它表示声音文件一共占据了大概145MB的内存。。。!也就是声音文件自己就占据了大概145MB内存。所以内存小于512MB的手机运行你的游戏将会非常的困难!
好吧,我现在知道了,声音文件占据了太多的内存!但是我该怎么改变这个情况呢?
其实每个问题都是有解决办法的!但是这个问题在于,
· “这是最佳和最优的解决方案么?”
为了得到答案,让我们在我们的例子中继续采取某些措施。
第一步:对声音剪辑的一些设置进行调整
为了对这一步所做的事情有一个更好的理解,你应该首先看下下面的链接,那里面对于声音剪辑的不同设置有一个介绍(正确的理解对于优化来说是非常必要的)
- http://docs.unity3d.com/Manual/class-AudioClip.html
现在选择所有循环的背景音乐剪辑。
检视窗口将如下图这样显示设置:
可以从上图中看到,我们取消了选中“预加载声音数据”。选中“对安卓平台进行覆盖”以及设置加载类型为“流类型”。
“如果你已经好好阅读了刚才的那个链接,你可能已经知道为什么我要这么做的了:D“
第二步:准备进行安卓版本的构建
其他的构建步骤都跟之前是一样的。
你在手机上打开游戏注意到有什么不同了么?
在我的手机上,游戏加载时间从15秒降低到了2秒。。。!这大概在加载时间上有了5-7倍的提高。。。!
注意
这些数据可能会依据设备不同而有所不同,这主要是取决于中央处理器和内存性能的不同。这里面的数据只是我使用摩托罗拉MOTO G2时候的数据。
让我们检查下分析器。
你在这里面看到一些变化没有?
总的声音内存从145MB下降到5.MB,而且声音文件的数目并没有变化,我们并没有删掉一些声音文件!!!这在声音内存使用上的优化带来了大概25倍的提升!!
哦,太棒了!!但是,为什么。。。!
你已经知道该怎么办了!现在是来解释下为什么!
我们已经禁止了提前加载声音文件。因此,对于设备而言不会在启动的时候提前加载所有的声音剪辑,因此加载速度大大加快了!声音剪辑只有在它们真正被需要的时候才会被加载到内存中去。
但是,此时出现在你的头脑里面的问题可能是,“一旦我加载和使用了所有的声音剪辑文件,它们会不会始终占据内存而不被释放?”
如果你还记得我曾设置加载类型为流类型,所以它将缓存所有的声音剪辑文件,并且从缓存中开始播放。一旦缓存中的声音剪辑文件被播放完毕,它将被卸载,因此可以释放占据的内存。从而可以优化内存的使用!
你可能还有其他的问题,比如”为什么不对SFX音频文件做同样的事情?”
这是因为它们在游戏中使用的非常频繁,因此哪怕有一点的延迟也会让人感觉不舒服。事实上,我会建议把它们的加载类型改为”在加载的时候进行解压缩”来得到更快的执行速度(并不是对所有的文件都这么做,只对那些播放最频繁的文件做这个事情)。
不过这不是一个大问题,即使你有50 个SFX 声音文件,也不会使用超过10-20MB的内存,而这是完全可以接受的。
下图显示了有大概40个SFX声音剪辑文件的加载类型被设置为”在加载的时候进行解压缩”,一共占据了大概16MB的空间,这是可以接受的!
这确实是有帮助!声音优化是必要的!
是的,声音优化确实有必要。
如果我们能够合适地优化声音,我们就能留下大量的内存来供游戏进行一些其他重要的处理,因此能够创建一个对于移动端来说更加友好的游戏。与游戏正确的同步也是很重要的。因此,优化和适当的设置是必须的,这只能依赖正确的认识来实现。
原文链接