Unity3d熱更新全書-載入(一)從AssetBundle說起

瘋光無線發表於2014-08-07

Unity3D動態下載資源,有沒有解?有,AssetBundle就是通用解,任何一本書都會花大幅篇章來介紹AssetBundle.

我們也來說說AssetBundle

我們試全面的分析一下Unity3D提供的資源載入機制

1.Resources//內嵌資源,使用方法Resources.Load,可以載入任意種類的資源,不能動態修改,卒。

2.StreamingAssets//隨包資源,使用方法IO或WWW.LoadWWW.Load可以載入任意種類資源,IO僅限bytes 和 text。

3.WWW 從網路下載並載入

4.WWW 從網路載入AssetBundle

一和二顯然不具有熱更新的效果,這裡就不做討論。

3 4都是從網路載入,他們有什麼區別呢。

首先說3,這是沒有快取的,我們顯然不想讓使用者重複的浪費流量,不可取。

然後是4,assetBundle提供了一個版本號來做快取比對,可以比較好的起到更新的目標

assetBundle原來就是Unity3D為我們準備的解決方案,難怪每本書都會大篇介紹AssetBundle,後文簡稱AB。

每本書都告訴你,AB很強大,AB幫你解決了跨平臺問題,幫你解決了依賴關係。

而這個系列,不打算只講別人講的東西,我們要告訴你一些小祕密。

AssetBundle是天使還是惡魔

首先AB的確很好很強大,他能收納Unity自己的所有資源種類,貼圖、材質、shader、預設。

然後可以每平臺支援,這就是第一個陷阱,注意是每平臺支援,不是多平臺支援。

每個平臺要單獨匯出,而每個平臺到底差了些什麼呢?答案是,nothing。

那麼為什麼每個平臺要單獨匯出呢?因為Unity考慮到每個平臺的質量關係,進行了質量相關的差異化。

而最大的質量差異,源自貼圖。

有些平臺貼圖不壓縮,有些平臺貼圖要壓縮,而且根據不同的平臺特性,套用不同的壓縮演算法,先壓過再存到包裡。

這就是AB幫你乾的最主要的事情。

聽起來很貼心呢,等等,你是不是忘了一個特定的命題,這個命題叫做UI。

壓縮的圖片會有質量損失,UI貼圖我們通常是不壓縮的。

然後UI還會觸及到AB的另一個問題

以NGUI為例,NGUI的資源關係比較複雜,有貼圖-》圖集-》佈局

不同佈局經常交叉引用貼圖

如果用AB想把每個介面分開打包,給使用者最小的資源更新量,這個任務可以用災難來形容。

最終熱更新推送給使用者的東西是以檔案為單位的,而AB在小粒度檔案並且之間有較為複雜的引用關係這種需求下的使用是一場災難。

AB對每個平臺的差異編譯不是可選的,而是強制的,假如你有web、ios、android三個平臺,無論如何你都要匯出三次。

沒了AssetBundle,我們怎麼辦

把碎片檔案下載回來,並且組裝

對於UI這個情境,是完全可行的。把佈局和圖集儲存為文字形式,把文字和貼圖下載回來,然後組裝。

對於其他的場景片段,在有動畫和貼圖需要壓縮的情況下,AB依然是唯一選擇。

unity沒有提供在執行時壓縮貼圖的手段,動畫也不容易存取,只能在執行時壓縮DXT,只有pc和wp8支援。

對於各種各樣的資源載入會特別的凌亂麼?不會。

其實本質上可以統一成Bytes的處理

Texture可以從Bytes載入

字串 可以從Bytes載入

AB可以從Bytes載入

自定義二進位制儲存,嘛本身就是bytes

所以只要我們的下載系統提供下載bytes並快取,之後所有的資源載入都從Bytes進行,就可以統一起來。

下載部分我們在另一個專題介紹。

下一篇介紹將UI佈局儲存到檔案與恢復。

相關文章