听说你的项目中仅这些资源就卡成了翔?看看他们怎么做!
目錄
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打包中的問題。下圖就是我們多次測試的記錄:
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以及資源的狀態,幫助我們進行更高效的資源分析和優化。
原文出處:侑虎科技
本文作者:admin
轉載請與作者聯系,同時請務必標明文章原始出處和原文鏈接及本聲明。
總結
以上是生活随笔為你收集整理的听说你的项目中仅这些资源就卡成了翔?看看他们怎么做!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 正则基础详解
- 下一篇: 强人工智能是潘多拉魔盒吗