- 說明
- AssetBundle簡介
- AssetBundle内部格式
- normal bundle
- scene bundle
- 壓縮
- AssetBundle内部格式
說明
本系列所使用unity版本為5.3.4f1。
AssetBundle簡介
AssetBundle即資源包,是Unity Pro提供和推薦的資源打包方式,它可以把多個自定義的遊戲對象或者資源以二進制形式儲存到Assetbundle檔案中。Assetbundle支援所有unity可識别的格式:模型、貼圖、音頻、整個場景等,其中最為友善的是可以将關聯的内容制作成一個prefab,例如一個模型的貼圖、動作和模型等,然後将整個prefab導出到AssetBundle,Unity會自己收集該Prefab使用到的關聯檔案,将其一并打入AssetBundle檔案,并保留prefab中資源和腳本之間互相關聯。
AssetBundle内部格式
-
以下圖來自官網,黑體為翻譯。
一個AssetBundle本質上是将一些對象組合成一個序列化檔案,根據是普通包(normal bundle)還是場景包(scene bundle),Assetbundle的資料檔案展開略有不同。
normal bundle
普通包由本身資訊(Assetbundle)、各個對象和音頻檔案組成。
scene bundle
場景包還包含了預加載資料(PreloadData)、共享資料(shaderData)和全局光照資料(Global Illumination Data)。
壓縮
AssetBundle可以選擇是否壓縮,Unity5.3之前隻能使用LZMA壓縮,Unity5.3之後支援選擇LZ4壓縮。
官網意譯:圖中壓縮部分表示可有塊壓縮(chunk-based)、流壓縮(stream-based)兩種方式。流壓縮(LZMA)在處理整個資料塊時使用同一個字典,它提供了最大可能的壓縮率但隻支援順序讀取。塊壓縮(LZ4)指的是原始資料被分成大小相同的子塊并單獨壓縮。如果你想要實時解壓/随機讀取開銷小,則應該使用這種。
釋義:LZMA壓縮方式的優點在于使用同一個字典壓縮率較高,但隻能順序讀取意味着加載任意一個資源時,都需要将整個AssetBundle解壓,造成卡頓和額外記憶體占用。LZ4基于塊壓縮率較低(測試LZMA換LZ4:86.9M -> 108M),但隻需解壓需要的塊即可,不會有大的卡頓和額外記憶體占用。後面會詳細對比兩種壓縮方式。
AssetBundle内部格式
這裡有一篇Unity3D asset bundle 格式簡析,分析了unity3.5下Assetbundle的内部格式,總結下來結構如下:
- AssetBundleFileHead : 記錄了版本、是否壓縮等主要描述資訊。
- AssetFileHeader :包含一個檔案清單,記錄了每個資源的name,offset,length等。
- Asset1 : 第一個資源本身,内部結構如下
- AssetHeader :包含了TypeTree大小、檔案大小、format等。
- TypeTree(可選):記錄了asset 對象的class id,在 Unity3d 的官方文檔 可以查到每個id的對象。
- ObjectPath :主要記錄了一個pathID(資源唯一索引id)。
- AssetRef:記錄了AssetBundle對外部資源的引用情況。
- Asset2 :第二個資源,結構跟上面一樣
- ……> : 更多資源
大緻符合官網上normal bundle的内容,看來Unity在方面變動不大,文中也提到了分析方式是閱讀disunity源碼,而disunity也已經支援了unity5,有興趣也可以分析unity5中Assetbundle的内部結構。