深挖unity的資源管理

2021-07-28 23:56:22 字數 1447 閱讀 1373

unity在這方面比較黑箱 有時候很困惑 

比較特殊的就是這個destroy.

destroy乙個asset的例項是可以的,但是如果destroy乙個asset就會把這個asset檔案被摧毀。

對於prefab,這種差異很好區分,應該destroy那個instantiate出來的object

但是對於一些特殊的asset,這個差異就不那麼好理解了。

比如貼圖,一般很少顯式的去instantiate建立例項,而是這樣:

a.renderer.maintexture = assetbundle1.load("貼圖1")

b.renderer.maintexture = assetbundle1.load("貼圖1")

這種方法 其實是個引用 ,如果你destroy這個assetbundle1 那貼圖1就沒了 如果你destroy這個a或者b的maintexture,也是一樣結果。

如果你

texture tex = instantiate( assetbundle1.load("貼圖1")) as texture;

這個tex是可以被destroy的 要例項乙個貼圖 匯入的地方要標誌為readable。

如果你迴圈:

a.renderer.maintexture = assetbundle1.load("貼圖2")

b.renderer.maintexture = assetbundle1.load("貼圖2")

不停載入新貼圖,之前建立的貼圖就成了無引用的游離assets,會導致記憶體不斷增加。解決辦法 要麼你自己記錄每一次載入的物件,在不用的時候用resources.unloadasset(object)釋放,簡單的辦法用乙個resources.unloadunusedassets就能把這些沒有指向的游離asset全部釋放掉,但是很慢。

如果概念不太清楚的,destroy要慎用 除了prefab.

簡單的說 load的東西釋放應該用unload,instantiate的東西才用destroy,一一對應起來理論上就沒有洩露。如果找不到當時那個load的物件了就簡單的resources.unloadunusedassets。destroy乙個asset等於刪掉那個資源,奇怪官方論壇居然很多人建議destroy texture,洋人也不都是乾貨。

download.assetbundle.unload(true)這句一般就會unload這個assetbundle並且把關聯的例項物件都清除。有這句理論上你不用destroy。

另外記憶體**不是即時的 我試過跟蹤,發現unity和mono的

gc工作並不是很效率,和標準.net的

gc有較大差距。之前曾經碰到過,連續load unload閃退的情況,後來發現

gc沒有及時生效,記憶體還是會突破限制,於是就在每個unload後跟了乙個gc.collect()

另外現在

www不需要顯式的dispose,你看官方demo現在都不用這個了

unity資源管理 記憶體池

記憶體池思想 建立物件時,先檢查記憶體池中是否有快取物件,如果沒有再建立新的。刪除物件時,不立即銷毀,快取一段時間,避免重複建立,提公升執行效率,用空間換時間的做法。常用怪 npc 技能特效 血條等。基本功能 儲存,獲取,智慧型刪除。實現方式 基本物件 public class poolitem p...

Unity專案中的資源管理

貼圖資源配置 對於這資源管理,unity提供非常豐厚的支援。以貼圖為例子,unity支援直接把原始貼圖直接放進工程,不需要做任何額外處理。unity根據貼圖配置會自動生成最後的貼圖資料。不同平台 ios android pc 支援的貼圖格式不一樣,通過配置檔案的形式,最後方便的生成不同格式的貼圖。這...

Unity3D的資源管理

asset bundles 製作 buildpipeline.buildassetbundle 載入 assetbundle.load 解除安裝 assetbundle.unload bool unloadallloadedobjects unloadallloadedobjects true 釋放...