美文网首页unity性能优化
【转】声效优化以此改善游戏性能

【转】声效优化以此改善游戏性能

作者: JervieQin | 来源:发表于2018-07-15 15:36 被阅读3次

    为什么我的游戏加载时间这么长?

    为什么在播放游戏音效的时候会有这么大的一个延迟?

    为什么游戏音效文件会占据这么多的内存?

    为什么在播放游戏音效的时候,会在游戏中出现一些延迟?

    我是否没有正确处理游戏音效?

    如果你刚接触Unity,你需要首先了解下Unity里面的声音管理是如何工作的。

    Unity中的声音管理是非常简单和基本的,那么它是如何影响我的游戏的呢?

    是的,它很简单,但是它能让你的游戏变得瘫痪!

    为了理解上面所说的内容,让我们举一个简单的例子。

    第一步 按照如下的方法设置场景:

    · 生成一个带两个按钮的画布(一个按钮是MusicButton,另外一个是SoundButton)。然后在场景中加入两个声音源。然后加入一个新的游戏物体,命名为SoundManager。(当然你也可以根据你的需要来对它进行命名)。

    按照下面的结构设置层次关系:

    如何对Unity中的声音进行优化以提高你游戏的性能

    我的场景设置就像上图展示的这样简单(这仅仅是为了给你一个概念):

    如何对Unity中的声音进行优化以提高你游戏的性能

    第二步 按照如下的方法设置脚本:

    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首特效声音剪辑。

    现在检查下分析器,看看分析中的声音音效部分。

    如何对Unity中的声音进行优化以提高你游戏的性能

    查看下“总的声音文件所占的内存”,它表示声音文件一共占据了大概145MB的内存。。。!也就是声音文件自己就占据了大概145MB内存。所以内存小于512MB的手机运行你的游戏将会非常的困难!

    好吧,我现在知道了,声音文件占据了太多的内存!但是我该怎么改变这个情况呢?

    其实每个问题都是有解决办法的!但是这个问题在于,

    · “这是最佳和最优的解决方案么?”

    为了得到答案,让我们在我们的例子中继续采取某些措施。

    第一步:对声音剪辑的一些设置进行调整

    为了对这一步所做的事情有一个更好的理解,你应该首先看下下面的链接,那里面对于声音剪辑的不同设置有一个介绍(正确的理解对于优化来说是非常必要的)

    现在选择所有循环的背景音乐剪辑。

    检视窗口将如下图这样显示设置:

    如何对Unity中的声音进行优化以提高你游戏的性能

    可以从上图中看到,我们取消了选中“预加载声音数据”。选中“对安卓平台进行覆盖”以及设置加载类型为“流类型”。

    “如果你已经好好阅读了刚才的那个链接,你可能已经知道为什么我要这么做的了:D“

    第二步:准备进行安卓版本的构建

    其他的构建步骤都跟之前是一样的。

    你在手机上打开游戏注意到有什么不同了么?

    在我的手机上,游戏加载时间从15秒降低到了2秒。。。!这大概在加载时间上有了5-7倍的提高。。。!

    注意

    这些数据可能会依据设备不同而有所不同,这主要是取决于中央处理器和内存性能的不同。这里面的数据只是我使用摩托罗拉MOTO G2时候的数据。

    让我们检查下分析器。

    你在这里面看到一些变化没有?

    如何对Unity中的声音进行优化以提高你游戏的性能

    总的声音内存从145MB下降到5.MB,而且声音文件的数目并没有变化,我们并没有删掉一些声音文件!!!这在声音内存使用上的优化带来了大概25倍的提升!!

    哦,太棒了!!但是,为什么。。。!

    你已经知道该怎么办了!现在是来解释下为什么!

    我们已经禁止了提前加载声音文件。因此,对于设备而言不会在启动的时候提前加载所有的声音剪辑,因此加载速度大大加快了!声音剪辑只有在它们真正被需要的时候才会被加载到内存中去。

    但是,此时出现在你的头脑里面的问题可能是,“一旦我加载和使用了所有的声音剪辑文件,它们会不会始终占据内存而不被释放?”

    如果你还记得我曾设置加载类型为流类型,所以它将缓存所有的声音剪辑文件,并且从缓存中开始播放。一旦缓存中的声音剪辑文件被播放完毕,它将被卸载,因此可以释放占据的内存。从而可以优化内存的使用!

    你可能还有其他的问题,比如”为什么不对SFX音频文件做同样的事情?”

    这是因为它们在游戏中使用的非常频繁,因此哪怕有一点的延迟也会让人感觉不舒服。事实上,我会建议把它们的加载类型改为”在加载的时候进行解压缩”来得到更快的执行速度(并不是对所有的文件都这么做,只对那些播放最频繁的文件做这个事情)。

    不过这不是一个大问题,即使你有50 个SFX 声音文件,也不会使用超过10-20MB的内存,而这是完全可以接受的。

    下图显示了有大概40个SFX声音剪辑文件的加载类型被设置为”在加载的时候进行解压缩”,一共占据了大概16MB的空间,这是可以接受的!

    如何对Unity中的声音进行优化以提高你游戏的性能

    这确实是有帮助!声音优化是必要的!

    是的,声音优化确实有必要。

    如果我们能够合适地优化声音,我们就能留下大量的内存来供游戏进行一些其他重要的处理,因此能够创建一个对于移动端来说更加友好的游戏。与游戏正确的同步也是很重要的。因此,优化和适当的设置是必须的,这只能依赖正确的认识来实现。

    原文链接

    相关文章

      网友评论

        本文标题:【转】声效优化以此改善游戏性能

        本文链接:https://www.haomeiwen.com/subject/veyppftx.html