Unity開發實戰探討-資源的載入釋放最佳策略簡要心得

超愛煜發表於2019-06-23

Unity開發實戰探討-資源的載入釋放最佳策略簡要心得

看過我另外一篇關於Unity資源釋放隨筆《Unity開發實戰探討-資源的載入釋放最佳策略》如果覺得略微複雜,那麼下面是一些比較簡要的心得體會:

概括

常用資源載入的方法有三種:靜態,Resources內部資源,AssetBundle外部資源

資源釋放的方式 有二種:立刻釋放和統一釋放。

靜態

靜態就是資源直接放場景,靜態資源無法立刻釋放,但場景關閉由引擎統一釋放,開發者無法干預,所以最為無腦。

但靜態過於死板,除了整個場景生命週期中必須使用的資源外,不建議靜態載入,為什麼,消耗時間,佔用記憶體;比如說,遊戲場景持續使用的背景音樂,那麼靜態的確是最佳選擇;但如果場景的開場要播放一個5M的音樂後面不再使用,這個資源用靜態就是白白增加了5M音樂的載入時間和浪費了5M記憶體,得不償失。

靜態資源的載入策略是: 只載入必要固定的資源,或者極其微小損耗不大的資源。

釋放策略是:由引擎負責。

Resources內部資源

Resources的資源一般和遊戲一起打包,一般是遊戲內使用的關鍵資源。

Resources主要載入一些動態的或者需要靈活處理的資源。載入的辦法是先Reources.Load,然後GameObject.Instantiate,立刻釋放的辦法是Reources.UnloadAsset,統一釋放的辦法是Resources.UnloadUnusedAssets。

Resources的主要優點是使用靈活,缺點是開發複雜;載入的時候注意一個資源只需要Reources.Load一次,管理好Load出來資源的引用,儘量不要用靜態引用,給釋放製造困難。UnloadUnusedAssets前必須注意釋放所有引用,所有Instantiate出來的物件必須銷燬。

Resources的載入釋放策略是: 只載入必須使用的資源,載入以後如果無需重複使用,或者使用頻率非常的低,應該在明確使用完畢以後(如圖片顯示結束,音樂播放完畢)立刻用Reources.UnloadAsset釋放。對於後續仍然會反覆採用的資源,建議在記憶體中快取引用,以防止後續載入不再反覆呼叫Load函式,場景關閉前釋放快取,銷燬所有例項化物件,等待Resources.UnloadUnusedAssets統一釋放。UnloadUnusedAssets釋放建議在當前場景完全銷燬以後,再後續場景中執行最為穩妥。

AssetBundle外部資源

 AssetBundle資源的機制基本和Resources類似,但可以獨立打包,支援網路下載和檔案讀取,一般是遊戲中使用的輔助資源。

 AssetBundle機制要比Resources多一步,首先要通過AssetBundle.LoadFromXXX把AssetBundle載入到記憶體,然後使用AssetBundle.LoadAsset載入資源,最後GameObject.Instantiate為例項化物件。所以一個完整例項化的 AssetBundle存在三處記憶體引用,在釋放策略上相對複雜。

 AssetBundle的釋放功能主要通過AssetBundle.Unload,而且也可以使用Reources.UnloadAsset和Resources.UnloadUnusedAssets進行釋放。

 AssetBundle的載入釋放策略分兩種情況:

載入完畢以後不再需要使用的資源包,可以再載入完畢以後立刻呼叫AssetBundle.Unload(false)釋放資源包記憶體,而在此基礎上,對於AssetBundle.LoadAsset以後並不再使用的資源,可以通過Reources.UnloadAsset釋放,如需持續使用,也可能等待Resources.UnloadUnusedAssets後續統一釋放。

載入完畢以後仍需持續使用的資源包,則必須保留AssetBundle引用,這種方式下,比較建議的方式是在場景完全銷燬以後,一次性呼叫AssetBundle.Unload(true)完全釋放改資源包和其所有載入資源。

相關文章