全面理解unity加載和內(nèi)存管理

全面理解unity加載和內(nèi)存管理

ID:35520240

大?。?9.03 KB

頁數(shù):5頁

時間:2019-03-25

全面理解unity加載和內(nèi)存管理_第1頁
全面理解unity加載和內(nèi)存管理_第2頁
全面理解unity加載和內(nèi)存管理_第3頁
全面理解unity加載和內(nèi)存管理_第4頁
全面理解unity加載和內(nèi)存管理_第5頁
資源描述:

《全面理解unity加載和內(nèi)存管理》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。

1、最近一直在和這些內(nèi)容糾纏,把心得和大家共享一下:Unity里有兩種動態(tài)加載機制:一是Resources.Load,一是通過AssetBundle,其實兩者本質(zhì)上我理解沒有什么區(qū)別。Resources.Load就是從一個缺省打進程序包里的AssetBundle里加載資源,而一般AssetBundle文件需要你自己創(chuàng)建,運行時動態(tài)加載,可以指定路徑和來源的。其實場景里所有靜態(tài)的對象也有這么一個加載過程,只是Unity后臺替你自動完成了。詳細說一下細節(jié)概念:AssetBundle運行時加載:來自文件就用CreateFromFile(注意這種方

2、法只能用于standalone程序)這是最快的加載方法也可以來自Memory,用CreateFromMemory(byte[]),這個byte[]可以來自文件讀取的緩沖,www的下載或者其他可能的方式。其實WWW的assetBundle就是內(nèi)部數(shù)據(jù)讀取完后自動創(chuàng)建了一個assetBundle而已Create完以后,等于把硬盤或者網(wǎng)絡(luò)的一個文件讀到內(nèi)存一個區(qū)域,這時候只是個AssetBundle內(nèi)存鏡像數(shù)據(jù)塊,還沒有Assets的概念。Assets加載:用AssetBundle.Load(同Resources.Load)這才會從Asset

3、Bundle的內(nèi)存鏡像里讀取并創(chuàng)建一個Asset對象,創(chuàng)建Asset對象同時也會分配相應(yīng)內(nèi)存用于存放(反序列化)異步讀取用AssetBundle.LoadAsync也可以一次讀取多個用AssetBundle.LoadAllAssetBundle的釋放:AssetBundle.Unload(flase)是釋放AssetBundle文件的內(nèi)存鏡像,不包含Load創(chuàng)建的Asset內(nèi)存對象。AssetBundle.Unload(true)是釋放那個AssetBundle文件內(nèi)存鏡像和并銷毀所有用Load創(chuàng)建的Asset內(nèi)存對象。一個Prefab

4、從assetBundle里L(fēng)oad出來里面可能包括:Gameobjecttransformmeshtexturematerialshaderscript和各種其他Assets。你Instantiate一個Prefab,是一個對Assets進行Clone(復(fù)制)+引用結(jié)合的過程,GameObjecttransform是Clone是新生成的。其他mesh/texture/material/shader等,這其中些是純引用的關(guān)系的,包括:Texture和TerrainData,還有引用和復(fù)制同時存在的,包括:Mesh/material/Phy

5、sicMaterial。引用的Asset對象不會被復(fù)制,只是一個簡單的指針指向已經(jīng)Load的Asset對象。這種含糊的引用加克隆的混合,大概是搞糊涂大多數(shù)人的主要原因。專門要提一下的是一個特殊的東西:ScriptAsset,看起來很奇怪,Unity里每個Script都是一個封閉的Class定義而已,并沒有寫調(diào)用代碼,光Class的定義腳本是不會工作的。其實Unity引擎就是那個調(diào)用代碼,Clone一個scriptasset等于new一個class實例,實例才會完成工作。把他掛到Unity主線程的調(diào)用鏈里去,Class實例里的OnUpda

6、teOnStart等才會被執(zhí)行。多個物體掛同一個腳本,其實就是在多個物體上掛了那個腳本類的多個實例而已,這樣就好理解了。在newclass這個過程中,數(shù)據(jù)區(qū)是復(fù)制的,代碼區(qū)是共享的,算是一種特殊的復(fù)制+引用關(guān)系。你可以再Instantiate一個同樣的Prefab,還是這套mesh/texture/material/shader...,這時候會有新的GameObject等,但是不會創(chuàng)建新的引用對象比如Texture.所以你Load出來的Assets其實就是個數(shù)據(jù)源,用于生成新對象或者被引用,生成的過程可能是復(fù)制(clone)也可能是引用

7、(指針)當(dāng)你Destroy一個實例時,只是釋放那些Clone對象,并不會釋放引用對象和Clone的數(shù)據(jù)源對象,Destroy并不知道是否還有別的object在引用那些對象。等到?jīng)]有任何游戲場景物體在用這些Assets以后,這些assets就成了沒有引用的游離數(shù)據(jù)塊了,是UnusedAssets了,這時候就可以通過Resources.UnloadUnusedAssets來釋放,Destroy不能完成這個任務(wù),AssetBundle.Unload(false)也不行,AssetBundle.Unload(true)可以但不安全,除非你很清楚

8、沒有任何對象在用這些Assets了。配個圖加深理解:雖然都叫Asset,但復(fù)制的和引用的是不一樣的,這點被Unity的暗黑技術(shù)細節(jié)掩蓋了,需要自己去理解。關(guān)于內(nèi)存管理按照傳統(tǒng)的編程思維,最好的方法是:自己維

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動畫的文件,查看預(yù)覽時可能會顯示錯亂或異常,文件下載后無此問題,請放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負(fù)責(zé)整理代發(fā)布。如果您對本文檔版權(quán)有爭議請及時聯(lián)系客服。
3. 下載前請仔細閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時可能由于網(wǎng)絡(luò)波動等原因無法下載或下載錯誤,付費完成后未能成功下載的用戶請聯(lián)系客服處理。