天天看點

AssetBundle系列——資源的加載、簡易的資料總管

每個需要進行資源管理的類都繼承自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方式加載資源的時候,不能進行同步加載操作,隻能異步,我見到過其他人也遇到過這個問題,很是蛋疼菊緊。

上一篇: D3D的繪制

繼續閱讀