在Unity中優化遊戲聲音

目標

  • 爲什麼我的遊戲加載時間那麼長?
  • 爲什麼播放遊戲聲音時延遲那麼長?
  • 爲什麼聲音文件佔那麼多的內存?
  • 爲什麼我一播放聲音遊戲就那麼卡?
  • 難道是因爲我在開發時對聲音的處理有問題?
    也許你在加載聲音時都會出現以上的問題衝到你的腦門上!!
    好吧,我知道這種感覺!!聲音管理起來很棘手;當我開發第一個遊戲的時候我也有遇到過相同的問題。我在網上任何地方都找不到原因和解決方案。所以我決定發佈這篇文章,希望能幫助到你。

測試

如果你是Unity初學者,首先需要弄清楚聲音管理如何在Unity中工作的。
爲此,你可以參照下面的鏈接,去了解一下Audio ClipsAudio ListenersAudioSources的基本操作: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的設置全設爲默認即可。
現在測試它在編輯器是否能正常工作。

把發佈平臺設置爲安卓平臺

生成Android Build的時候記得把Development BuildAuto 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的設置:
http://docs.unity3d.com/Manual/class-AudioClip.html
https://blog.csdn.net/f_957995490/article/details/106627331
現在選擇所有的背景音樂資源。
在Inspector中的設置將會如下圖所示:

如上圖所示,讓我們取消Preload Audio Data(預加載音頻數據)選項。然後把Override for Android選項勾上,並且設置Load TypeStreaming
“如果你已經閱讀過上面鏈接裏的內容,你可能已經知道我們爲什麼要這麼做了。”

準備Android Build

所有Building的步驟都和上面的一樣。
你有看到什麼不同嘛?
在我這邊,我的遊戲加載時間從15秒變爲了2秒…!這將比原來的加載時間快了5-7倍啊~!!!

設備的不同

不同的設備效果也許會不一樣,這將取決於你的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 LoadSFX AudioClipsTotal Audio Memory仍然爲16MB,這對於我來說已經很不錯了!!

這太有用了!!聲音的優化是必須的啊!!

是的,這是必須滴。如果我們能適當的優化聲音資源,我們爲在遊戲運行中其他重要的資源留下了大量的內存資源,這便創建了一個流程的手機遊戲。所以適當的優化和設置是必須的。

原文鏈接

原文鏈接:https://mp.weixin.qq.com/s?__biz=MzI1MzE0MDg3Nw==&mid=2651812879&idx=1&sn=e33d36a35f9d0473b5816777e3e524da&scene=0#wechat_redirect

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章