深入理解unity資源與ab包[文書特制]_第1頁
深入理解unity資源與ab包[文書特制]_第2頁
深入理解unity資源與ab包[文書特制]_第3頁
深入理解unity資源與ab包[文書特制]_第4頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

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

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

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

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

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

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

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

溫馨提示

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

最新文檔

評論

0/150

提交評論