優化AB資源以及內存優化

1:目標android

2:檢查ios

3:迭代優化編輯器

4:額外收益工具

5:結合unity Profiler優化內存佔用字體

6:總結優化

1:目標 優化AB,一方面下降了AB的大小,下降了包體大小,另一方面ab加載時所佔用的內存也會減少,下降了遊戲內存不足崩潰的機率。動畫

同時經過對AB中包含資源的深刻分析,能夠避免將一些舊的資源錯誤打入到ab中。ui

2:檢查指針

2.1: Unity4.x的ab打包是手動管理依賴,很是麻煩,而Unity5.x自動管理AB之間的依賴,大大下降了開發負擔。 手動管理有點相似於c語言直接用指針,控制性強,可是極其容易出錯;而自動管理依賴,會致使對ab資源打包原理的缺乏分析和關注,使得對ab的優化不夠。對象

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

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

2.2:咱們遊戲作了若干次AB的檢測,逐步優化掉了一些AB打包中的問題:

輸入圖片說明

UWA中的ab資源檢測界面,主要分爲兩個欄目: 一個是以AB爲觀察對象,另一個是以 資源自己爲觀察對象;

輸入圖片說明

第一次檢測的結果,能夠看到不少ab中有冗餘的資源。

輸入圖片說明

能夠看資源使用欄目,查看哪些資源冗餘了,通常都是些shader,材質,紋理,sprite,動畫,之類的資源冗餘。

輸入圖片說明

點擊資源使用,看到資源冗餘的狀況。

看到有大量的sprite冗餘,由於咱們遊戲每一個UI打入到了一個獨立的ab中,而UI公共使用的一些sprite沒有打入到公共ab中,致使這些sprite被打入到了每一個UI ab中, 而sprite對應的紋理,也被打入到了這些ui的ab中。

解決方案就是,額外加一個公共ab,將這些sprit打入到這個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的時候,忘記處理了。

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

最後優化的結果: 輸入圖片說明

剩下兩個Sprite是錯誤引用了Unity本身的資源,能夠調整相關UI去掉對應的應用。

Texture2d中,2個是上面錯誤的sprite使用對應的紋理;一個是角色模型的材質中引用到的紋理,沒有打入到公共ab中;

還有3個比較特殊,這三個紋理對應的sprite已經打入到公共ab中了,可是在UI中,是以rawImage的方式引用到這幾個sprite,rawImage引用的sprite,都至關於直接引用紋理,而不是sprite,致使不能使用公共ab,修正方法額外複製一份這些sprite,設置其importe typ爲texture,將這些texture2d打入到公共ab中。

舊的字體的材質和字體自己這兩個已經刪除了,上圖的這個結果是我沒刪除以前的。

Mesh模型,能夠將其打入到公共ab中便可。

能夠看到要徹底優化掉這些冗餘資源,還須要對現有的UI等作一些修改,因此ab優化不僅僅是隻優化打包流程就能夠的哦。

4:額外收益 經過查看每一個ab中包含哪些資源能夠發現一些問題

4.1:首先是咱們的sprite居然都沒有打包成sprite atlas,

輸入圖片說明

能夠看到,ui紋理都是一張張碎圖,究其緣由,一是 sprite沒有設置packingtag,二是 sprite都放在resources目錄下面,致使打包ab的時候,resources目錄下的sprite是不會生成圖集的,unity的坑,所以調整一下打包代碼,打包的時候將這些sprite移動到resources外面某個目錄中, 打包ab結束,再放回去。

正常的結果,能夠看到texture2d的名字都叫作 spriteatlas 了。

輸入圖片說明

4.2:發現一些舊的sprite也被打包進了ab中,利用uwa的功能,很是容易找到全部引用到舊資源的UI,在unity中調整,去掉對舊資源的引用。

5:結合unity Profiler優化內存佔用 ab的冗餘去除掉了,可是優化尚未結束,編譯一個development的程序,設置鏈接到Profiler。 在Profiler中查看內存的使用狀況: 能夠看到紋理內存佔用大大下降了。

以前50-60MB, 優化後,20-30MB。 輸入圖片說明

接着作一次內存採樣,看一些每一個紋理的內存大小:

輸入圖片說明

能夠看到有些圖特別大,是由於沒有設置爲壓縮格式致使的,ios是pvrtc, android是 etc1格式。 設置爲壓縮格式品質會有一些下降,可是內存和加載速度會優化。

6:總結 總之,使用UWA的ab分析工具,能夠很是直觀的看到全部的ab以及資源的狀態,很是利於咱們進行資源的分析和優化~ 感謝UWA團隊的工做~~

相關文章
相關標籤/搜索