天天看點

Unity5-ABSystem(一):AssetBundle原理說明AssetBundle簡介AssetBundle内部格式AssetBundle内部格式

  • 說明
  • 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中資源和腳本之間互相關聯。

Unity5-ABSystem(一):AssetBundle原理說明AssetBundle簡介AssetBundle内部格式AssetBundle内部格式

AssetBundle内部格式

  • 以下圖來自官網,黑體為翻譯。

      一個AssetBundle本質上是将一些對象組合成一個序列化檔案,根據是普通包(normal bundle)還是場景包(scene bundle),Assetbundle的資料檔案展開略有不同。

normal bundle

 普通包由本身資訊(Assetbundle)、各個對象和音頻檔案組成。

 

Unity5-ABSystem(一):AssetBundle原理說明AssetBundle簡介AssetBundle内部格式AssetBundle内部格式

scene bundle

  場景包還包含了預加載資料(PreloadData)、共享資料(shaderData)和全局光照資料(Global Illumination Data)。

 

Unity5-ABSystem(一):AssetBundle原理說明AssetBundle簡介AssetBundle内部格式AssetBundle内部格式

壓縮

  AssetBundle可以選擇是否壓縮,Unity5.3之前隻能使用LZMA壓縮,Unity5.3之後支援選擇LZ4壓縮。

 

Unity5-ABSystem(一):AssetBundle原理說明AssetBundle簡介AssetBundle内部格式AssetBundle内部格式

  

  官網意譯:圖中壓縮部分表示可有塊壓縮(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的内部結構。