Unity UI優化

UI優化

動靜分離、拆分UI、預加載、字體拆分、滾屏優化、網格重構優化、展示關閉優化、對象池、貼圖優化、圖集拼接優化、UI業務邏輯中GC優化等。

一、動靜分離

** 問題:**unity中UGUI系統都是使用網格模型來構建,UI元素只要“動”,就會發生網格的重構合併。正所謂牽一髮而動全身,少的UI元素的動導致整個UI的重構,由此帶來重繪導致了cpu的開銷。

解決方案: UGUI系統億Canvas作爲自己的重繪節點,所以需要以canvas作爲節點拆分動和靜的UI元素。比如某個展示頁面比較複雜,可以將那些靜止不會發生變化的(動畫、顏色、材質等)放到一個canvas下,把那些需要動的如常見的動畫、特效等UI放到一個canvas下。有些常駐的動畫,也可以單獨做一個canvas作爲這些效果的根結點。

二、拆分過重的UI

問題:隨着項目的迭代,UI系統的複雜度不斷上升。如果沒有良好的劃分和設計,會導致UI功能和結構越來越臃腫。UI實例化和初始化時,CPU消耗變大,後期維護迭代也變得越加困難。
解決方案:在UI設計的最初階段就要把各個畫布的主要職責劃分出來,一些窗體和圖標動效等也需要拆分出來作爲預製體。對於一些複雜的界面加載和實例化,可以逐模塊分散加載。

三、 UI預加載

問題:有些UI可能比較小、難以拆分,亦或者拆分後任然消耗很多CPU,它比較大常駐在界面。
解決方案:這些UI可以在遊戲開始前加載UI資源但不實例化,只是將其加載到內存中。跟進一步將UI的實例化和初始化也提前到遊戲開始前。實例化和初始化完成後,將其“隱藏”起來,待到需要的時候再將其展示出來。“隱藏”即可以將UI放在某一特定不被渲染或者未激活的層級,也可以將其放到攝像機視角之外藏起來(遮影步QAQ)。

Tips: Unity自帶Preload功能,在編輯器平臺設置裏面。Unity會在進入應用的時候講這些預製體進行預加載。

四、字體拆分

問題:字體一定程度上站了很大的空間(漢字😣),而且遊戲打多需要的文字固定,沒必要僅爲少數的文字使用而加入整個字體庫。
解決方案:數字字母等固定的字符可以單獨打包,漢字常用字符3000足夠遊戲使用,真遇到特殊字符可以單獨添加進去,在通過unity下的字體制作工具打包處理。

五、scroll view等列表優化

*問題:在揹包或一些數據項比較多的應用中,scroll view常常會有大量的元素存在,他們在窗口中的不斷滾動變化導致前面說的網格重構,消耗大量的CPU資源。
解決方案:類似scroll view這樣的組建需要有自己優化過的自定義組件,當然也有很多這種優秀的開源方案。大都類似數據庫查表一樣進行將數據進行分頁,只實例化加載稍微比可視化區域大點的數據項UI,當滾動達到一定範圍後再銷燬一部分不可見的元素,同時加載一部分後續可能顯示的元素,也會藉助後續提到對象池技術實現這一部分。

六、 網格重構優化

問題:UGUI系統網格合併機制是,只有將相同材質球的網格合併在一起,才能達到最佳效果。一個材質球對應一個圖集,只有相同圖集內的圖片才需要合併在一起。當元素需要改變顏色時,是通過改變頂點顏色實現,然後將他們重新合批到網格中去。在UI動畫裏修改UI顏色時,UGUI都會對網格進行重構。
解決方案:此時我們需要自定義UI元素的材質球,通過自定義材質球改變相應的顏色變化,此時UGUI不再重構網格,因爲把渲染工作交給了新的材質球,而非通過UGUI設置頂點顏色達到效果。(操作不當,自定義材質可能引發渲染排序等問題)

七、 UI的展示和隱藏

問題:打開和關閉界面都會消耗一定的CPU,打開需要實例化和初始化,關閉需要效果。
解決方案:利用碎片時間預加載。關閉時隱藏節點而不是效果,爲了避免關閉和激活時網格重構,可以將UI移出屏幕,此時需要注意這些不可見的UI元素需不需要停止起內部的一些邏輯,待顯示時再調用。爲了避免移出屏幕導致的相機裁剪變化,可以單獨設置一個層級爲不可見的layout,需要顯示時再將UI元素放在可見層級中去。

八、對象池的使用

問題:UI元素中比如scroll view中的選項類似於遊戲物體中的子彈,需要大量的顯示和效果,它們很零碎有很多,實例化和效果過程中會產生很多內存碎片和GC。
解決方案:採用對象池技術對這些對象池化,需要時從對象池申請,“銷燬”時將其放到池中,重複利用內存。

tips:

  1. 每個需要使用對象池的對象都需要繼承對象的基類對象,便於重載和區分,並區別初始化。
  2. 銷燬時對對象池接口回收,不要重複或忘記回收,因此在設計的過程中就要統一接口。
  3. 場景結束時及時銷燬對象池,避免內存駐留。
  4. 對象池應該是可伸縮的,在實例化對象超出對象池大小時自動擴充池子大小,在實例化對象不頻繁和少量時可以縮減容量。

九、UI貼圖優化

問題:倒入貼圖資源時,貼圖的某些屬性或數據其實並不是必要的,但要佔用很大的空間,不合理的貼圖大小也會增大資源佔用。
解決方案:導入貼圖資源時注意事項:

  1. alpha通道是否需要
  2. 2次方貼圖大小
  3. 讀寫權限是否需要
  4. minimal是否需要
  5. 合適的壓縮方式。
    上述過程可以通過unity editor擴展asset importer pipeline的方式自動化管理,可以通過Texture Importer類控制指定導入路徑的圖片具體設置。

《Unity高級編程》讀書筆記

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