这篇文章的主要目的是通过优化声音来让你了解声音的优化可以极大的提升Unity游戏的性能。
这篇文章是我们正在进行的《对Unity游戏进行优化的最新倡议》中的一部分。
如果你对如何优化你的游戏有兴趣的话,你可以看看这个系列文章:
《对Unity游戏进行优化的最新倡议》
为什么我的游戏加载时间这么长?
为什么在播放游戏音效的时候会有这么大的一个延迟?
为什么游戏音效文件会占据这么多的内存?
为什么在播放游戏音效的时候,会在游戏中出现一些延迟?
我是否没有正确处理游戏音效?
是的,游戏的声音部分可以让人非常的头疼!想象下你正处在一个项目发布的最后期限并且几乎到了吃午饭的时间,你终于决定在你的游戏中集成声音音效了。现在声音音效已经准备好了,是时候进行构建了!
然后到了#@%#的时刻!(不要忘记还需要计算互相指责的时间:))
所有的声音播放出来就像是上面的问题这样,在你的头脑里面吵成一团!
是的,我知道这种感觉!声音音效是非常难管理的。当我在开发我的第一款游戏的时候我遇到了同样的问题。我在互联网上找不到这个问题背后的任何原因或者任何的解决方案。所以我决定把这些内容放到这篇文章里面,也许这些内容对你会有所帮助。
如果你刚接触Unity,你需要首先了解下Unity里面的声音管理是如何工作的。
为了达到这个目的,你可以参考以下链接,它将给你一个关于声音剪辑、声音监听器以及声音源的一个基本概念。
Unity中的声音管理是非常简单和基本的,那么它是如何影响我的游戏的呢?
是的,它很简单,但是它能让你的游戏变得瘫痪!
为了理解上面所说的内容,让我们举一个简单的例子。
第一步 按照如下的方法设置场景:
· 生成一个带两个按钮的画布(一个按钮是MusicButton,另外一个是SoundButton)。然后在场景中加入两个声音源。然后加入一个新的游戏物体,命名为SoundManager。(当然你也可以根据你的需要来对它进行命名)。
按照下面的结构设置层次关系:
我的场景设置就像上图展示的这样简单(这仅仅是为了给你一个概念):
第二步 按照如下的方法设置脚本:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
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的手机运行你的游戏将会非常的困难!
好吧,我现在知道了,声音文件占据了太多的内存!但是我该怎么改变这个情况呢?
其实每个问题都是有解决办法的!但是这个问题在于,
· “这是最佳和最优的解决方案么?”
为了得到答案,让我们在我们的例子中继续采取某些措施。
第一步:对声音剪辑的一些设置进行调整
为了对这一步所做的事情有一个更好的理解,你应该首先看下下面的链接,那里面对于声音剪辑的不同设置有一个介绍(正确的理解对于优化来说是非常必要的)
现在选择所有循环的背景音乐剪辑。
检视窗口将如下图这样显示设置:
可以从上图中看到,我们取消了选中“预加载声音数据”。选中“对安卓平台进行覆盖”以及设置加载类型为“流类型”。
“如果你已经好好阅读了刚才的那个链接,你可能已经知道为什么我要这么做的了:D“
第二步:准备进行安卓版本的构建
其他的构建步骤都跟之前是一样的。
你在手机上打开游戏注意到有什么不同了么?
在我的手机上,游戏加载时间从15秒降低到了2秒。。。!这大概在加载时间上有了5-7倍的提高。。。!
这些数据可能会依据设备不同而有所不同,这主要是取决于中央处理器和内存性能的不同。这里面的数据只是我使用摩托罗拉MOTO G2时候的数据。
让我们检查下分析器。
你在这里面看到一些变化没有?
总的声音内存从145MB下降到5.MB,而且声音文件的数目并没有变化,我们并没有删掉一些声音文件!!!这在声音内存使用上的优化带来了大概25倍的提升!!
你已经知道该怎么办了!现在是来解释下为什么!
我们已经禁止了提前加载声音文件。因此,对于设备而言不会在启动的时候提前加载所有的声音剪辑,因此加载速度大大加快了!声音剪辑只有在它们真正被需要的时候才会被加载到内存中去。
但是,此时出现在你的头脑里面的问题可能是,“一旦我加载和使用了所有的声音剪辑文件,它们会不会始终占据内存而不被释放?”
如果你还记得我曾设置加载类型为流类型,所以它将缓存所有的声音剪辑文件,并且从缓存中开始播放。一旦缓存中的声音剪辑文件被播放完毕,它将被卸载,因此可以释放占据的内存。从而可以优化内存的使用!
你可能还有其他的问题,比如”为什么不对SFX音频文件做同样的事情?”
这是因为它们在游戏中使用的非常频繁,因此哪怕有一点的延迟也会让人感觉不舒服。事实上,我会建议把它们的加载类型改为”在加载的时候进行解压缩”来得到更快的执行速度(并不是对所有的文件都这么做,只对那些播放最频繁的文件做这个事情)。
不过这不是一个大问题,即使你有50 个SFX 声音文件,也不会使用超过10-20MB的内存,而这是完全可以接受的。
下图显示了有大概40个SFX声音剪辑文件的加载类型被设置为”在加载的时候进行解压缩”,一共占据了大概16MB的空间,这是可以接受的!
是的,声音优化确实有必要。
如果我们能够合适地优化声音,我们就能留下大量的内存来供游戏进行一些其他重要的处理,因此能够创建一个对于移动端来说更加友好的游戏。与游戏正确的同步也是很重要的。因此,优化和适当的设置是必须的,这只能依赖正确的认识来实现。
如果你还有任何的疑问,请随意的在下方的留言区留言询问,我会尽快回复您。同时我们也接受各样建议!我们也很乐意学习新技术。请继续关注我们,因为我们会很快上传更多的博客文章!
稍后,你可以看下”Unity中的音乐优化”,也许你会对这篇文章感兴趣。
这篇文章是我们正在进行的《对Unity游戏进行优化的最新倡议》中的一部分。
如果你对如何优化你的游戏有兴趣的话,你可以看看这个系列文章:
《对Unity游戏进行优化的最新倡议》
我希望当你在对Unity中的声音部分进行优化的时候,会觉得这篇文章的内容对你的工作有所帮助。如果你有任何有关Unity方面的问题,请在评论中留言以便让我知道,我会尽快进行回复。
已经有了一个游戏开发方面的想法?那你为什么就还在等待?现在就联系我们让我们知道。我们公司已经是印度最好的Unity 3D 游戏开发方面的公司之一了。
- 要了解更多信息,请查看这个链接里面的内容: http://www.theappguruz.com/blog/optimize-game-sounds-in-unity#sthash.GZzAFJ8N.dpuf
【版权声明】
原文作者未做权利声明,视为共享知识产权进入公共领域,自动获得授权。