每個需要進行資源管理的類都繼承自IAssetManager,該類維護它所使用到的所有資源的一個資源清單。并且每個資源管理類可以重寫其資源引用接口和解引用接口。
每個管理器有自己的管理政策,比如SceneManager對場景背景圖可以保留最近使用的幾張,使用LRU算法維護目前記憶體中的貼圖張數等...
資料總管類,UnloadUnusedAsset函數保證隻有在真正有資源需要解除安裝的時候才調用Resources.UnloadUnusedAssets();
有一點需要注意的地方就是,在資源解壓完成後,一定要記得要釋放壓縮包記憶體,即:
www.assetBundle.LoadAsync(GetAssetName(name), type);
www.assetBundle.Unload(false);
因為,www壓縮包資料隻能手動解除安裝,跳轉場景都不會删除,是以加載完立即unload是一個好習慣。
還有一點需要注意的www.assetBundle.mainAsset是一個同步加載的操作,也就是說調用此函數時會卡。using UnityEngine;using System.Collections;
資源管理的關鍵在于以下幾點:
(1)資源所對應的幾塊記憶體的管理,Unity的記憶體一直是一個相對比較棘手的方面,是以一定要多做嘗試找到規律和方法;
(2)資源加載、解除安裝政策,什麼時候加載什麼時候解除安裝需要根據遊戲類型來進行定制;
(3)資源打包政策,也就是以什麼機關進行什麼類型的資源打包,原則上是讓同一資源盡量隻需要打包一次,比如多個場景都用到了同一棵樹,那麼最好是對這棵樹單獨打包等等。
比如Prefab1和Prefab2同時引用了Fbx1,将2個prefab單獨打包時都會分别包含Fbx1,并且解壓到記憶體時,也會有2份獨立的Fbx1,這樣會造成記憶體變大,這點一定要注意。
......
Unity記憶體和資源這一塊雖然顯得比較拖泥帶水,不過隻要使用的夠規範,一般還是能夠保證記憶體的幹淨的。
還有一個尚未解決的問題,Unity使用www方式加載資源的時候,不能進行同步加載操作,隻能異步,我見到過其他人也遇到過這個問題,很是蛋疼菊緊。