UGUI合批原理筆記
可以通過Frame debugger檢視每個drawcall繪製了哪些東西
本文測試環境:unity2018.2.9f1,基於Unity Editor (PC平臺)
合批的過程
網格更新機制
- Cavans.SendWillRenderCanvas
- m_LayoutRebuildQueue
- m_GraphicRebuildQueue
- Canvas.BuildBatch 更新所有DrawCall
- WaitingForJob 子執行緒網格合併
- PutGeometryJobFence
- BatchRendere.Flush UI如果開多執行緒渲染,BatChRender.Flush會增高,主執行緒在等待子執行緒的結果時Flush會等待。
哪些因素的改變會引起合批
從原始碼中可以看到,這些資料的改變會引起合批
原始碼地址: UI / UnityEngine.UI / UI / Core / Utility / VertexHelper.cs
private List<Vector3> m_Positions = ListPool<Vector3>.Get();//頂點位置的拷貝或指定新頂點位置的陣列 private List<Color32> m_Colors = ListPool<Color32>.Get();//顏色 private List<Vector2> m_Uv0S = ListPool<Vector2>.Get();//基本紋理座標 private List<Vector2> m_Uv1S = ListPool<Vector2>.Get();//第二套紋理座標 private List<Vector2> m_Uv2S = ListPool<Vector2>.Get();//第三套紋理座標 private List<Vector2> m_Uv3S = ListPool<Vector2>.Get(); private List<Vector3> m_Normals = ListPool<Vector3>.Get();//法線 privateList<Vector4> m_Tangents = ListPool<Vector4>.Get();//切線 private List<int> m_Indices = ListPool<int>.Get();//mesh的索引
怎麼避免合批
儘量減少“動態”長文字(執行時修改文字內容)
Image或Text,如果不需要點選,則不要勾選Raycasts
降低介面的更新頻率
避免圖集分離,使用相同的圖集。
同一圖集的Image元素應儘量保證在Hierarchy中連續,避免中間插入其他圖集,或插入文字。
避免圖片疊加在一起(遮擋,旋轉)
如果sprite是中心鏤空且切圖為九宮格時,可以去除fill center,以減少over draw
透明Image,用來做響應點選事件,同樣存在開銷
避免或減少Mask的使用,1個Mask至少增加兩個DC
避免頻繁刪除/增加UI物件,UI層次結構變化會引起Canvas的更新
避免頻繁動態的更新UI元素的Vertex, Rect, Color, Material, Texture等,可能引起Canvas資料更新和Batch更新計算,有可能引起VBO Update(重新提交頂點資料)。
儘可能使用少的UI Material和貼圖(使用圖集),使得可以Batching。
同一父節點下所有子節點,保持相同的層次結構(如List控制元件下的item),便於底層相同depth下UI元素Batch。
避免UI元素數目過多和層次結構過於複雜影響Batch更新速度。
固定的Text考慮與背景圖層合在一張圖上(可能不便本地化,但可以減少drawcall)。
使用快取池,對快取頻繁使用的元素。
HUD處理(動靜分離)
Canvas重建就是為了合併DC,將經常變化的文字放在獨立的Canvas,手動分離Canvas(會增加DC,不能和其它文字合併),但文字變化時其它Canvas就不需要重建。
示例:名字和血條分開在兩個不同的節點下。這樣當血條變化時,就不會引起名字的更新。如下圖所示:
2、設定scale為0,而不是設定active = false/true,或者新增Alpha Group,設定alpha=0/1
不勾選FillCenter
鏤空九宮格不勾選FillCenter,在Scene的Overdraw下可以檢視到,不勾選FillCenter,overdraw會減少。
少用Effect功能
少用Outline,Tiled Sprite
outline額外生成7倍頂點
在一個空場景中,給Text新增outline之後,頂點數大約是未新增之前的7.5倍。
去掉outline之後,頂點數下降了很多。
Image不使用Tiled
type=simple時的頂點數
使用Tiled之後,頂點數也上漲很多。
參考資料
工具:UI層級輔助工具,用於顯示UI的層級、批次等資料,便於UI效能優化。使用者可以結合以上規則,分析當前UI元素排列順序、材質貼圖設定,優化UI Batching,減少UI Drawcall。