如何優化AssetBundle資源。

https://blog.uwa4d.com/archives/Usparkle_AB2.html

聽說你的項目中僅這些資源就卡成了翔?看看他們怎麼做!

  • 作者:admin
  • /
  • 時間:2016年11月15日
  • /
  • 瀏覽:6990 次
  • /
  • 分類:厚積薄發

項目中的冗餘資源本身會在項目文件中佔據額外的空間,還有可能在內存中多次被加載,佔據內存。筆者通過UWA提供的資源檢測與分析,定位到所有AssetBundle中包含的冗餘資源,輕鬆對這些資源執行定點優化。具體怎麼做的,讓我們來看看詳細的實現步驟吧。


目錄

1、目標
2、檢查
3、迭代優化
4、額外收益
5、結合unity Profiler優化內存佔用
6、總結


一、目標

優化AssetBundle(下文簡稱AB),一方面降低了AB的大小、包體大小,另外一方面也能減小AB加載時所佔用的內存,從而降低遊戲因內存不足崩潰的概率。同時通過對AB中包含資源的深入分析,可以避免將一些舊的資源錯誤打入到AB中。

二、檢查

1.Unity 4.x的AB打包是手動管理依賴,非常麻煩,而Unity 5.x自動管理AB之間的依賴,大大降低了開發負擔。手動管理有點類似於C語言直接用指針,控制性強,但是極其容易出錯;而自動管理依賴,會導致對AB資源打包原理的缺少分析和關注,使得對AB的優化不夠。

打包的基本策略:將公共依賴的資源打入到一個公共AB中,其它AB依賴於公共AB。

我們使用的是Unity 5.x, Unity 5.x中打包AB有兩種方式:一種是直接在編輯器中爲每個資源設置其所屬於AB的名字; 另外一種方式是在代碼中,設置每個AB包含哪些資源路徑。我們採用的是第二種方式,即在代碼中指定。

2.我們在UWA(www.uwa4d.com)上提交了若干次資源檢測,逐步優化掉了一些AB打包中的問題。下圖就是我們多次測試的記錄:

0.png
UWA中的AB資源檢測界面,主要分爲兩個欄目:一個是以AB爲觀察對象,另外一個是以 資源本身爲觀察對象。
請輸入圖片描述

第一次檢測的結果,可以看到很多AB中有冗餘的資源。點擊“資源使用”欄目,可以查看哪些資源冗餘了,一般都是些Shader,材質,紋理,Sprite,動畫之類的資源冗餘。
請輸入圖片描述

如下圖,我們還能看到資源冗餘的具體情況:
請輸入圖片描述

在此,我們看到有大量的Sprite冗餘,因爲我們遊戲的每個UI都單獨打了一個AB包,而UI公共使用的一些Sprite沒有打入到公共AB中,導致這些Sprite被打入到了每個UI AB中, 而Sprite對應的紋理,也被打入到了這些UI的AB中。解決方案:額外加一個公共AB,將這些Sprite打入到這個AB中。使UI AB依賴於這個公共AB。

材質的冗餘
主要是廢棄掉的粒子效果仍然被打入到了AB中,刪除掉這些粒子效果即可。

動畫冗餘
忘記將UI動畫打到公共AB中了,把動畫目錄添加到公共AB即可。

Shader冗餘
每個材質被單獨打到獨立的AB中了,導致材質用的Shader被重複打入。這裏之前有個誤區:將Shader放到一個Prefab中,將Prefab打入到公共AB中,並不能使這些材質AB依賴於這個公共AB, Unity5.x中 AB之間的依賴必須是顯式的,而不能是隱式的,必須顯式地將Shader的路徑加入到公共AB中,才能使材質AB依賴於公共AB。

Font冗餘
錯誤地使用了一箇舊的字體,解決辦法是調整所有使用舊字體的UI。

Mesh冗餘
模型打AB的時候,忘記處理導致。

三、迭代優化,驗證

發現了這些冗餘資源,新增一個公共AB,將冗餘資源全部打入其中。運行時,首先加載這個公共AB裏面所有的資源。

最後的優化結果:
請輸入圖片描述
剩下兩個Sprite是錯誤引用了Unity自己的資源,可以調整相關UI去掉對應的應用。

Texture2D中,一個是上面錯誤的Sprite使用對應的紋理;一個是角色模型的材質中引用到的紋理,沒有打入到公共AB中;還有三個比較特殊,這三個紋理對應的Sprite已經打入到公共AB中了,但是在UI中,是以RawImage的方式引用到這幾個Sprite。RawImage引用的Sprite,都相當於直接引用紋理,而不是sprite,導致不能使用公共AB,修正方法額外複製一份這些sprite,設置其importe typ爲texture,將這些Texture2d打入到公共AB中。

Mesh模型,可以將其打入到公共AB中即可。

可以看到要完全優化掉這些冗餘資源,還需要對現有的UI等做一些修改,所以AB優化不單單是隻優化打包流程就可以的哦。

四、額外的收穫

通過查看每個AB中包含哪些資源可以發現一些問題。

1.首先是我們的Sprite竟然都沒有打包成Sprite atlas。
請輸入圖片描述

可以看到,UI紋理都是一張張碎圖。究其原因,一是Sprite沒有設置packingtag,二是 Sprite都放在Resources目錄下面,導致打包AB的時候,Resources目錄下的Sprite是不會生成圖集的。因此調整一下打包代碼,打包的時候將這些Sprite移動到resources外面某個目錄中,打包AB結束再放回去。
請輸入圖片描述

如上就是正常的結果,可以看到texture2d的名字都叫做spriteatlas 了。

2.發現一些舊的Sprite也被打包進了AB中,利用UWA工具,非常容易找到所有引用到舊資源的UI,在Unity中調整,去掉對舊資源的引用。

五、結合Unity Profiler優化內存的佔用

AB的冗餘去除掉了,但是優化還沒有結束。編譯一個Development的程序,設置連接到Profiler。在Profiler中查看內存的使用情況如下,可以看到紋理內存佔用大大降低了。
請輸入圖片描述

之前50-60MB, 優化後20-30MB。接着做一次內存採樣,看一下每個紋理的內存大小:
請輸入圖片描述
可以看到有些圖特別大,是因爲沒有設置爲壓縮格式導致的,iOS是PVRTC, Android是 ETC1格式。設置爲壓縮格式品質會有一些降低,但是內存和加載速度會優化。

六、總結

總之,使用UWA的資源檢測與分析工具,可以非常直觀地看到所有的AssetBundle以及資源的狀態,幫助我們進行更高效的資源分析和優化。


這是侑虎科技第141篇原創文章,感謝作者李勇(QQ:233242872)供稿。如果您有任何獨到的見解或者發現也歡迎聯繫我們,一起探討。(QQ羣:793972859)

同時,作者也是U Sparkle活動參與者,UWA歡迎更多開發朋友加入U Sparkle開發者計劃,這個舞臺有你更精彩!

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章