深入理解unity資源與ab包_第1頁
深入理解unity資源與ab包_第2頁
深入理解unity資源與ab包_第3頁
深入理解unity資源與ab包_第4頁
深入理解unity資源與ab包_第5頁
已閱讀5頁,還剩2頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、深入理解資源(Asset)與AssetBundleAB包文件Assetbundle文件格式可以理解為,擁有一個(gè)列表頭和壓縮數(shù)據(jù)塊列表。列表頭定義了各數(shù)據(jù)塊的起始位置和大小。數(shù)據(jù)塊列表中存儲(chǔ)壓縮過的unity對(duì)象的序列化數(shù)據(jù)。AssetBundle對(duì)象加載并創(chuàng)建AssetBundle對(duì)象。 Assetbundle對(duì)象是一個(gè)輕量級(jí)對(duì)象,只包含一個(gè)資源(Asset)對(duì)象列表和指向?qū)嶋HAB包數(shù)據(jù)的文件對(duì)象。AB包文件加載完成后存放在內(nèi)存中,注意只有LZ4能夠以壓縮格式存放在內(nèi)存中。這段內(nèi)存不能直接訪問,由AssetBundle對(duì)象負(fù)責(zé)管理。AssetBundle.Unload()會(huì)釋放這段內(nèi)存。Ass

2、et資源實(shí)際上unity中并沒有與資源(Asset)這個(gè)詞對(duì)應(yīng)的類。我們一般把從AssetBundle中LoadAsset()出來的對(duì)象稱為資源 (Asset)。AssetBundle.LoadAsset()等接口從AssetBundle對(duì)象中解壓數(shù)據(jù)反序列化構(gòu)建Object。Unity完美的序列化機(jī)制可以使任何對(duì)象都可以直接序列化為連續(xù)內(nèi)存塊,同樣任何對(duì)象都可以通過AssetBundle.LoadAsset()反序列化為結(jié)構(gòu)化對(duì)象。AssetBundle.LoadAsset()接口返回類型是Object。此功能也暗示了可以將任何對(duì)象從ab包內(nèi)存中反序列化出來構(gòu)建。Prefab是什么?創(chuàng)建ab

3、包時(shí),一般會(huì)將prefab打入到包中。游戲中通過AssetBundle.LoadAsset()將prefab對(duì)象加載出來。代碼1: 再通過加載出來的prefab構(gòu)建GameObject:代碼 2: 思考:代碼1中m_Prefab是什么?是什么類型?如果是GameObject,那么這個(gè)GameObject為什么沒有出現(xiàn)在場(chǎng)景中?如果是GameObject,為什么一定要通過Instantiate再次clone一個(gè)GameObject出來?Unity的C+代碼分為兩部分,Runtime和Editor。Runtime中包含引擎的所有核心功能,Editor包含編輯器所需核心功能。Prefab.h/cpp

4、存放于Editor中,實(shí)現(xiàn)了編輯器中prefab的功能。Prefab繼承于Object,包含一個(gè)指向GameObject的指針。其功能非常簡(jiǎn)單,僅僅只是維護(hù)編輯器中prefab之間的關(guān)聯(lián)關(guān)系,用來實(shí)現(xiàn)編輯器中prefab修改編輯功能。Prefab只是對(duì)GameObject在編輯器中一個(gè)功能封裝。上一段源碼:從源碼判斷,Prefab功能非常簡(jiǎn)單,只是實(shí)現(xiàn)編輯器中各prefab關(guān)聯(lián)編輯功能。結(jié)論:因此可以推斷,在最終發(fā)布環(huán)境中,并無Prefab對(duì)象存在。代碼1中 LoadAsset構(gòu)建的對(duì)象是GameObject,此GameObject并不存在于當(dāng)前場(chǎng)景(scene)中,而是被unity放到了一個(gè)

5、空?qǐng)鼍爸?。LoadAsset構(gòu)建的GameObject對(duì)象,Unity希望我們把它當(dāng)作資源(asset)使用。對(duì)比代碼2中m_Prefab和m_GameObject的scene變量。思考?為什么不能需要構(gòu)建GameObject時(shí),直接從AssetBundle中反序列化構(gòu)建呢?推測(cè)Unity希望開發(fā)者們遵循的工程實(shí)踐是,將AssetBundle中反序列化構(gòu)建的GameObject作為資源(asset)進(jìn)行管理。當(dāng)游戲中需要構(gòu)建GameObject時(shí),以資源(asset)為基礎(chǔ)構(gòu)建,而不是從連續(xù)內(nèi)存上反序列化去構(gòu)建。從而將對(duì)象構(gòu)建與數(shù)據(jù)解壓解耦。資源(Asset)資源(Asset)是unity希望

6、開發(fā)者們遵循的一種工程實(shí)踐規(guī)范。1. 所有AssetBundle中LoadAsset出來的對(duì)象稱為資源(Asset)。2. 資源(Asset)與AssetBundle之間有強(qiáng)耦合關(guān)系。3. 資源(Asset)不要直接被使用在業(yè)務(wù)邏輯中。資源(Asset)和業(yè)務(wù)中創(chuàng)建的對(duì)象沒有功能上不同。但在使用方法上有截然不同的區(qū)分。資源(Asset)可以由AssetBundle.Unload(true)統(tǒng)一強(qiáng)制銷毀,也可以單個(gè)銷毀。但是對(duì)于同一個(gè)AssetBundle,LoadAsset出的資源(Asset)只能被銷毀一次,銷毀后再重復(fù)LoadAsset()會(huì)失敗。Instantiate()英文翻譯為”實(shí)例

7、化”,個(gè)人覺得這個(gè)接口用英文克隆”clone”描述更準(zhǔn)確。Object.Instantiate()可以對(duì)任何對(duì)象clone。包括Texture、Shader、AudioClip,當(dāng)然應(yīng)該不會(huì)有人對(duì)這類內(nèi)存占用大且不會(huì)被修改的對(duì)象clone。所以,遵循unity暗示的工程實(shí)踐規(guī)范。所有占用大量?jī)?nèi)存且不會(huì)被修改的資源(Asset)不被clone,所有需要修改的邏輯對(duì)象會(huì)被clone出一個(gè)新的實(shí)例。如下圖所示:Instantiate一個(gè)GameObject時(shí),GameObject和Material會(huì)被clone出新的實(shí)例,而貼圖(Texture)則保持引用。引用與非引用資源非引用資源類型:建議使用Instantiate構(gòu)建新對(duì)象。GameObject被Instantiate時(shí),GameObject包含的非引用資源也會(huì)自動(dòng)被Instantiate。GameObjectMaterial引用資源類型:這些對(duì)象,在GameObject被Instantiate時(shí)會(huì)保持引用。MeshTextureShaderAudioClipBytes最佳工程實(shí)踐(Best practice)所有資源(Asset)對(duì)象不再被引用時(shí),AssetBundle才可以被銷毀由于資源(Asset)對(duì)象被銷毀后,無法重復(fù)從AssetBundle中Load出來。因此,必須所

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論