Unity 動態載入與記憶體(二)

2021-07-25 22:46:37 字數 2769 閱讀 3326

unity幾種動態載入prefab方式的差異:

其實存在3種載入prefab的方式:

一是靜態引用,建乙個public的變數,在inspector裡把prefab拉上去,用的時候instantiate

二是resource.load,load以後instantiate

三是assetbundle.load,load以後instantiate

三種方式有細節差異,前兩種方式,引用物件texture是在instantiate時載入,而assetbundle.load會把pe***b的全部assets都載入,instantiate時只是生成clone。所以前兩種方式,除非你提前載入相關引用物件,否則第一次instantiate時會包含載入引用類assets的操作,導致第一次載入的lag。官方論壇有人說resources.load和靜態引用是會把所有資源都預先載入的,反覆測試的結果,靜態引用和resources.load也是ondemand的,用到時才會載入。

幾種assetbundle建立方式的差異:

createfromfile:這種方式不會把整個硬碟assetbundle檔案都載入到記憶體來,而是類似建立乙個檔案操作控制代碼和緩衝區,需要時才實時load,所以這種載入方式是最節省資源的,基本上assetbundle本身不佔什麼記憶體,只需要asset物件的記憶體。可惜只能在pc/mac standalone程式中使用。

createfrommemory和www.assetbundle:

這兩種方式assetbundle檔案會整個映象於記憶體中,理論上檔案多大就需要多大的記憶體,之後load時還要占用額外記憶體去生成asset物件。

什麼時候才是unusedassets?

看乙個例子:

object obj = resources.load("myprefab");

gameobject instance = instantiate(obj) as gameobject;

.........

destroy(instance);

建立隨後銷毀了乙個prefab例項,這時候 myprefab已經沒有被實際的物體引用了,但如果這時:

resources.unloadunusedassets();

記憶體並沒有被釋放,原因:myprefab還被這個變數obj所引用

這時候:

obj = null;

resources.unloadunusedassets();

這樣才能真正釋放assets物件

所以:unusedassets不但要沒有被實際物體引用,也要沒有被生命週期內的變數所引用,才可以理解為 unused(引用計數為0)

所以所以:如果你用個全域性變數儲存你load的assets,又沒有顯式的設為null,那在這個變數失效前你無論如何unloadunusedassets也釋放不了那些assets的。如果你這些assets又不是從磁碟載入的,那除了unloadunusedassets或者載入新場景以外沒有其他方式可以解除安裝之。

乙個複雜的例子,**很醜陋實際也不可能這樣做,只是為了加深理解

複製**

很經典的對稱造型,用多少釋放多少。

說明:1 初始狀態

2 載入assetbundle檔案後,記憶體多了檔案映象,用量上公升,total object和assets增加1(assetbundle也是object)

3 載入texture後,記憶體繼續上公升,因為多了texture asset,total objects和assets增加1

4 載入prefab後,記憶體無明顯變化,因為最佔記憶體的texture已經載入,materials上公升是因為多了prefab的材質,total objects和assets增加6,因為 pe***b 包含很多 components

5 例項化prefab以後,視訊記憶體的texture memory、gameobjecttotal、objectsin scene上公升,都是因為例項化了乙個可視的物件

6 銷毀例項後,上一步的變化還原,很好理解

7 解除安裝assetbundle檔案後,assetbundle檔案映象占用的記憶體被釋放,相應的assets和total objects count也減1

8 直接resources.unloadunusedassets,沒有任何變化,因為所有assets引用並沒有清空

9 把prefab引用變數設為null以後,整個prefab除了texture外都沒有任何引用了,所以被unloadunusedassets銷毀,assets和totalobjects count減6

10 再把texture的引用變數設為null,之後也被unloadunusedassets銷毀,記憶體被釋放,assets和totalobjects count減1,基本還原到初始狀態

從中也可以看出:

texture載入以後是到記憶體,顯示的時候才進入視訊記憶體的texture memory。

所有的東西基礎都是object

load的是asset,instantiate的是gameobject和object in scene

load的asset要unload,new的或者instantiate的object可以destroy

Unity 動態載入Prefab

第一種方法,從resources資料夾讀取prefab assets resources是unity中的乙個特殊資料夾,放在這個資料夾裡的資源包括prefab可以被 動態載入。gameobject prefab gameobject resources.load prefabs character ...

Unity中的動態載入資源

在unity 3d裡有兩種動態載入機制 一是resources.load 一是通過assetbundle 其實兩者本質上沒有什麼區別。resources.load就是從乙個預設打程序式包裡的assetbundle裡載入資源,而一般assetbundle檔案需要你自己建立,執行時動態載入,可以指定路徑...

unity載入與鍊錶

今天來給大家分享一下unity載入與鍊錶,由於上一講已經把載入說過了,所以這次我們就來說一下關於鍊錶的問題,主要還是分享一下源 如果大家 有不懂的地方,可以在社群裡面提問,我會及時的做出解答。unity 用c 寫的鍊錶類 用於儲存座標點 1.using unityengine 2.using sys...