Related Posts Plugin for WordPress, Blogger...

6-32 AssetBundle Unload And Browser tool

本章要來介紹AssetBundle的卸載機制,以及官方提供的AssetBundle瀏覽工具。首先,如果將遊戲物件從場景中Destroy,Unity也不會自動卸載AssetBundle,即便你後面都不使用,已載入的AssetBundle仍占用記憶體。

除非你更換場景(Scene),更換的時候Unity會自動Destroy所有場景中的遊戲物件,並接著呼叫Resources.UnloadUnusedAssets,這個函數會將沒有用到的Asset從記憶體中卸載。

所以,當我們想要手動卸載不需要的Asset時該怎麼做?可以使用AssetBundle.Unload(bool)這個函數。這個函數依據布林值有兩種用法:

AssetBundle.Unload(true):卸載指定的AssetBundle中的Asset。

AssetBundle.Unload(false):卸載指定的AssetBundle中的Asset,但已加載到場景中的Asset將維持不變。

Unity官方並不建議使用AssetBundle.Unload(false),因為管理不當的話,有可能導致場景中有多份以上的相同Asset。

以下引用Unity官方文檔的圖進行解說。當使用AssetBundle.Unload(false)進行卸載時,場景中已使用的Material不會跟著卸載,AssetBundle與Material之間的Link會切斷。

重新讀取AssetBundle後,Unity不會重新將遺留在場景中的Material與AssetBundle連結起來。

假如場景中再度要使用AssetBundle內的Material時,此時的場景上會有兩份相同的Material,這樣就會有浪費記憶體的問題。

我們可以用程式碼來測試這個現象。首先,我使用AssetBundle讀取資源,使用Instantiate於場景中產生資源,接著呼叫assetBundle.Unload(false),使用false的話,不會影響場景中已經被產生出來的資源。


所以,於遊戲中可以看到,即便使用AssetBundle.Unload(false),房屋模型依舊存在。

接著我要再度載入相同的AssetBundle,並產生一個相同的房屋模型,放置在原本的房屋模型的旁邊。

這時的遊戲場景中會有兩棟房屋,右邊那一棟是第一次產生的,左邊那一棟是第二次產生的。

接著,我使用AssetBundle.Unload(true)。

左邊那一棟於第二次產生的房屋被卸載了,但第一次產生的房屋卻遺留在場景中,原因就是上面跟大家提到的,Untiy不會將前一次載入的資源重新連結。所以,剛剛我們雖然看見場景中有兩棟相同的房屋,但是記憶體內卻佔用了兩個相同的模型資源,造成浪費。

綜合上面所說的,Unity官方的文件上提出幾個建議。

大多數項目應該使用AssetBundle.Unload(true)。 兩種常用方法是:


  • 在整個生命週期中有明確使用Unload的時機,例如在關卡之間或在加載期間卸載臨時的AssetBundles。
  • 僅當物件都沒有任何參考時才卸載AssetBundles,這允許卸載後重新加載物件而不會造成記憶體重複的問題。


如果必須使用AssetBundle.Unload(false),那麼物件只能通過兩種方式卸載:


  • 在場景和代碼中消除對不需要的物件的所有引用後,調用Resources.UnloadUnusedAssets。
  • 不使用Additive方式加載場景。 Unity將銷毀當前場景中的所有物件並自動調用Resources.UnloadUnusedAssets。

接著介紹AssetBundle的瀏覽工具。首先,我們可以在Asset Store搜尋Asset Bundle Browser,並下載。

接著可以從Window/AssetBundle Browser開啟視窗。

打開以後,可以在Configure視窗中看見每一個AssetBundle內部的資源。

在Build視窗可以用來建立AssetBundle,可以選擇Build Target、OutputPath等選項。

其中有一個選項是Copy to StreamingAssets,StreamingAssets是Unity的預設資料夾,放在這個資料夾內的資源會『原封不動』的打包到安裝包內。通常,不管是聲音、影片、圖片等資源,都會以Unity格式處理後再進行打包,但是放在此資料夾內的話,資源原本是什麼格式,打包以後就還會是那個格式。

由於下載AssetBundle也是一個需要等待的過程,如果開啟遊戲就先讓玩家下載1G的AssetBundle,對玩家來說實在太難熬了。所以可以考慮把遊戲初始關卡的AssetBundle放在StreamingAssets內,讓玩家剛下載遊戲後就可以先玩前面的關卡,接著再逐步下載後面的關卡資料。

接著打開Advanced Settings後,就會看到壓縮選項,以及一些其他的設定值。關於這部分的介紹,可以參考以前的文章唷:
6-30 AssetBundle Option And Manifest File

留言