這篇文章將為大家詳細(xì)講解有關(guān)Unity3D中assetbundle格式的示例分析,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
創(chuàng)新互聯(lián)公司主要從事成都做網(wǎng)站、網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)崗巴,十余年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來(lái)電咨詢建站服務(wù):028-86922220
Unity3D 的 asset bundle 的格式并沒有公開。但為了做更好的差異更新,我們還是希望了解其打包格式。這樣可以制作專門的差異比較合并工具,會(huì)比直接做二進(jìn)制差異比較效果好的多。因?yàn)榭梢园?asset bundle 內(nèi)的數(shù)據(jù)拆分為獨(dú)立單元,只對(duì)變更的單元做差異比較即可。
網(wǎng)上能查到的資料并不是官方給出的,最為流行的是一個(gè)叫做 disunity 的開源工具。它是用 java 編寫的,只有源代碼,而沒有給出格式說(shuō)明(而后者比代碼重要的多)。通過(guò)閱讀 disunity 的代碼,我整理出如下記錄:
asset bundle 分為壓縮模式和非壓縮模式。壓縮模式僅僅是用開源的 lzma 庫(kù) 對(duì)整個(gè)非壓縮包做了一次整體壓縮。壓縮數(shù)據(jù)的頭有 13 個(gè)字節(jié),前 5 個(gè)字節(jié)是 lzma 解壓縮的 API 需要穿入的 props ,接下來(lái)的 4 字節(jié)是解壓縮后的數(shù)據(jù)庫(kù)長(zhǎng)度。最后 4 字節(jié)不用理會(huì)它。
把壓縮數(shù)據(jù)解開后,就和非壓縮模式?jīng)]有差別,下面只討論非壓縮格式:
assert bundle 的文件頭是從這樣一個(gè)數(shù)據(jù)結(jié)構(gòu)序列化出來(lái)的。
struct AssetBundleFileHead { struct LevelInfo { unsigned int PackSize; unsigned int UncompressedSize; }; string FileID; unsigned int Version; string MainVersion; string BuildVersion; size_t MinimumStreamedBytes; size_t HeaderSize; size_t NumberOfLevelsToDownloadBeforeStreaming; size_t LevelCount; LevelInfo LevelList[]; size_t CompleteFileSize; size_t FileInfoHeaderSize; bool Compressed; };
string 是直接以 \0 結(jié)尾的字符串,順序序列化;size_t 是大端的 4 字節(jié)數(shù)字;bool 是單個(gè)字節(jié);vector 就是順著排列的結(jié)構(gòu)。
根據(jù) Unity 版本的不同,assert bundle 的格式也不完全相同。Version 指明了 bundle 的格式版本,從 Unity 3.5 開始到 4.x 版都使用 Version = 3 ,下面只討論這個(gè)版本。HeaderSize 應(yīng)該恰好等于以上這個(gè)文件頭的數(shù)據(jù)長(zhǎng)度。
一個(gè) assert bundle 是由多個(gè) asset 文件打包而成,接下來(lái)順序打包了這些 asset 。序列化成這樣的結(jié)構(gòu):
struct AssetFileHeader { struct AssetFileInfo { string name; size_t offset; size_t length; }; size_t FileCount; AssetFileInfo File[]; };
對(duì)于每個(gè) asset ,又有它自己的數(shù)據(jù)頭。數(shù)據(jù)頭除了基本的數(shù)據(jù)頭結(jié)構(gòu) AssetHeader 外,還有額外的三個(gè)部分。disunity 把它們稱為 TypeTree ObjectPath 和 AssetRef 。注意:這里 Format 隨不同 Unity3D 的版本有所不同,我們只關(guān)心目前的版本的格式,這里 Format 為 9 (其它版本的格式,在大小端等問題上有所不同)。
struct AssetHeader { size_t TypeTreeSize; size_t FileSize; unsigned int Format; size_t dataOffset; size_t Unknown;
Unity 對(duì) Asset 數(shù)據(jù)做了簡(jiǎn)單粗暴的序列化操作。整個(gè)序列化過(guò)程是針對(duì)每種對(duì)象的數(shù)據(jù)結(jié)構(gòu)進(jìn)行的。TypeTree 是對(duì)數(shù)據(jù)結(jié)構(gòu)本身的描述,通過(guò)這個(gè)描述,就可以反序列化出每個(gè)對(duì)象。
AssetHeader 后面緊跟著的就是 TypeTree 。但是,這個(gè) TypeTree 對(duì)于 asset bundle 來(lái)說(shuō)是可選的,因?yàn)閿?shù)據(jù)結(jié)構(gòu)的信息可以事先放置在引擎中(引擎多半只支持固有的數(shù)據(jù)類型)。在發(fā)布到移動(dòng)設(shè)備上時(shí),TypeTree 是不打包到 asset bundle 中的。
每個(gè) asset 對(duì)象,都有一個(gè) class id ,可以在 TypeTree 中查到如何反序列化。class id 的和具體類型的對(duì)應(yīng)關(guān)系,在 Unity3d 的官方文檔 可以查到。但若我們只是想將差異比較在對(duì)象一級(jí)進(jìn)行(而不是具體比較對(duì)象中具體的屬性),那么就不需要解開具體對(duì)象的細(xì)節(jié)信息,這部分也不用關(guān)心。所以這里也不展開(有興趣可以讀一下 disunity 的代碼,格式并不復(fù)雜)。
在 AssetHeader 中的 TypeTreeSize 指的就是 TypeTree 部分的大小。接下來(lái)是每個(gè) AssetObject 的描述數(shù)據(jù)。
struct ObjectHeader { struct ObjectInfo { int pathID; int offset; int length; byte classID[8]; }; int ObjectCount; ObjectInfo Object[]; };
這里,所有的 int 都是以小端編碼的 4 字節(jié)整數(shù)(不同于外部文件格式采用的大端編碼)。在 Unity3D 中,每個(gè)對(duì)象都有唯一的字符串 path ,但是在 asset bundle 里并沒有直接保存字符串,而是一個(gè) hash 過(guò)的整數(shù),也可以看成是對(duì)這個(gè)對(duì)象的索引號(hào)。真正的對(duì)象放在數(shù)據(jù)頭的后面,偏移量為 offset 的地方。
這里的 offset 是相對(duì)當(dāng)前 asset 塊的。如果想取得正確的相對(duì)整個(gè)文件的位置,應(yīng)該是文件的 HeaderSize + asset 的 offset + asset 的 dataOffset + 這里的 object offset 。
接在 ObjectHeader 后的是 AssetRef 表,記錄了 Asset 的引用關(guān)系。用于指明這個(gè) bundle 內(nèi) asset 對(duì)外部 asset 的引用情況。AssetRefTable 結(jié)構(gòu)如下:
struct AssetTable { struct AssetRef { byte GUID[8]; int type; string filePath; string assetPath; }; int Count; byte Unknown; vector Refs;本文分享自微信公眾號(hào) - Unity3D游戲開發(fā)精華教程干貨(u3dnotes)。
關(guān)于“Unity3D中assetbundle格式的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。
本文名稱:Unity3D中assetbundle格式的示例分析
網(wǎng)頁(yè)URL:http://jinyejixie.com/article26/ijcdjg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)、搜索引擎優(yōu)化、定制網(wǎng)站、網(wǎng)站設(shè)計(jì)公司、全網(wǎng)營(yíng)銷推廣、網(wǎng)站改版
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)