Unity中三種資源加載方式:
1.靜態(tài)引用。具體操作:創(chuàng)建public變量崔兴,把文件掛到物體上印机,在Inspector里把相應資源給public變量,用的時候instantiate或者直接用鞭衩。
2.Resources.Load学搜。加載Resources文件夾下的資源,加載后instantiate.
3.AssetBundle.Load论衍。加載打包后的資源瑞佩。
4.Addressable
前兩種資源加載方式,對于引用對象是在instantiate時加載的坯台,而不是在加載時直接加載的炬丸,所以有時會造成第一次加載時客戶端卡。
第三種資源加載方式蜒蕾,在加載時會加載所有引用資源稠炬,instantiate時只是生成克隆。
說到Unity資源的卸載咪啡,就需要先了解要卸載什么首启。其實就是要卸載資源所占用的內存,使資源占用的內存釋放撤摸。
第四種詳見Addressable入門毅桃。
資源的加載和卸載
- 1.assetbundle文件內存鏡像占用的內存。在加載assetbundle文件完成后准夷,會在內存中形成assetbundle文件的內存鏡像钥飞,同一個assetbundle文件不能有兩個內存鏡像。
卸載方式:AssetBundle.UnLoad(false)衫嵌; - 從assetbundle文件中加載出來的資源所占的內存读宙。
資源類型:GameObject,Texture,Sprite,Shader,Material
GameObject為非引用類型,需要Instantiate實例化后使用楔绞。如果需要多個GameObject结闸,需要多次實例化掖棉。
卸載方式:AssetBundle.UnLoad(true);連同1的內存也會被釋放膀估。
如果想要只卸載某個已經加載的資源幔亥,用Resources.UnLoadAsset(obj)(只能用這個卸載引用資源);
3.Instantiate實例化的資源所占用的內存察纯。(一般是指GameObject)
Destroy主要用來銷毀實例化的內存占用帕棉,即銷毀克隆對象,也可用于銷毀靜態(tài)物體饼记,不會自動釋放該對象的所有引用香伴。
4.其他方式:
加載新場景時會自動銷毀2,3的內存占用具则,但是1的內存占用不會銷毀即纲,1只能通過AssetBundle.Unload去釋放。
- 從assetbundle文件中加載出來的資源所占的內存读宙。
一般的加載流程
1.創(chuàng)建assetbundle(WWW www = new WWW(url))
2.用AssetBundle.Load加載需要的資源
3.判斷資源的種類博肋,根據種類去選擇下一步操作(可把資源分為共享資源和非共享資源低斋,或者根據使用頻率選擇是否保存已經加載過的資源等)
4.確保加載完成后,調用AssetBundle.Unload(false)去卸載1創(chuàng)建出的鏡像文件匪凡。
一般的釋放流程
1.如果克隆了對象膊畴,用Destroy去銷毀。
2.在合適的地方調用Resources.UnloadUnusedAsset()病游,釋放已經沒有引用的資源(就是沒有地方在用的資源唇跨,引用計數為0)
3.如果是想卸載單獨的一個用Load加載的資源,用Resources.UnloadAsset(obj)釋放(只能用這個卸載引用資源)
4.如果想要立即釋放調用GC.Collect()衬衬。
舉例
UnityEngine.GameObject obj = Resources.Load("MyPrefab");
GameObject instance = Instantiate(obj) as GameObject;
Destroy(instance);
Resources.UnloadUnusedAssets();
這時买猖,內存并沒有釋放掉,因為MyPrefab還被obj這個變量所這用滋尉。
obj = null;
Resources.UnloadUnusedAssets();
這樣才能真正釋放
Resources.UnloadUnusedAssets()不但要沒有實際物體引用玉控,也要沒有被生命周期內的變量所引用,才可以釋放兼砖。
轉載參考:https://www.cnblogs.com/zhoujiangyue/articles/7066070.html