UGUI合批原理筆記

作者:@qingqing-zhao
本文為作者原創(chuàng)澜薄,轉(zhuǎn)載請注明出處:https://www.cnblogs.com/zhaoqingqing/archive/2018/09/25/9658403.htmlhttps://www.cnblogs.com/zhaoqingqing/p/9658403.html

可以通過Frame debugger查看每個(gè)drawcall繪制了哪些東西

UGUI源碼下載地址:https://bitbucket.org/Unity-Technologies/ui/downloads/

本文測試環(huán)境:unity2018.2.9f1茅信,基于Unity Editor (PC平臺)

合批的過程

網(wǎng)格更新機(jī)制

  • Cavans.SendWillRenderCanvas

    • m_LayoutRebuildQueue
    • m_GraphicRebuildQueue
  • Canvas.BuildBatch 更新所有DrawCall

    • WaitingForJob 子線程網(wǎng)格合并
    • PutGeometryJobFence
    • BatchRendere.Flush UI如果開多線程渲染,BatChRender.Flush會增高弦悉,主線程在等待子線程的結(jié)果時(shí)Flush會等待。

哪些因素的改變會引起合批

從源碼中可以看到倍靡,這些數(shù)據(jù)的改變會引起合批

源碼地址: UI / UnityEngine.UI / UI / Core / Utility / VertexHelper.cs

private List<Vector3> m_Positions = ListPool<Vector3>.Get();//頂點(diǎn)位置的拷貝或指定新頂點(diǎn)位置的數(shù)組
private List<Color32> m_Colors = ListPool<Color32>.Get();//顏色
private List<Vector2> m_Uv0S = ListPool<Vector2>.Get();//基本紋理坐標(biāo)
private List<Vector2> m_Uv1S = ListPool<Vector2>.Get();//第二套紋理坐標(biāo)
private List<Vector2> m_Uv2S = ListPool<Vector2>.Get();//第三套紋理坐標(biāo)
private List<Vector2> m_Uv3S = ListPool<Vector2>.Get();
private List<Vector3> m_Normals = ListPool<Vector3>.Get();//法線
private List<Vector4> m_Tangents = ListPool<Vector4>.Get();//切線
private List<int> m_Indices = ListPool<int>.Get();//mesh的索引

Mesh的API:http://wiki.ceeger.com/script/unityengine/classes/mesh/mesh

http://wiki.ceeger.com/script/unityengine/classes/mesh/mesh.getindices

怎么避免合批

盡量減少“動(dòng)態(tài)”長文本(運(yùn)行時(shí)修改文本內(nèi)容)

Image或Text碉京,如果不需要點(diǎn)擊厢汹,則不要勾選Raycasts

降低界面的更新頻率

避免圖集分離,使用相同的圖集谐宙。

同一圖集的Image元素應(yīng)盡量保證在Hierarchy中連續(xù)烫葬,避免中間插入其他圖集,或插入文本卧惜。

避免圖片疊加在一起(遮擋厘灼,旋轉(zhuǎn))

如果sprite是中心鏤空且切圖為九宮格時(shí),可以去除fill center咽瓷,以減少over draw

透明Image设凹,用來做響應(yīng)點(diǎn)擊事件,同樣存在開銷

避免或減少M(fèi)ask的使用茅姜,1個(gè)Mask至少增加兩個(gè)DC

避免頻繁刪除/增加UI對象闪朱,UI層次結(jié)構(gòu)變化會引起Canvas的更新

避免頻繁動(dòng)態(tài)的更新UI元素的Vertex, Rect, Color, Material, Texture等,可能引起Canvas數(shù)據(jù)更新和Batch更新計(jì)算钻洒,有可能引起VBO Update(重新提交頂點(diǎn)數(shù)據(jù))奋姿。

盡可能使用少的UI Material和貼圖(使用圖集),使得可以Batching素标。

同一父節(jié)點(diǎn)下所有子節(jié)點(diǎn)称诗,保持相同的層次結(jié)構(gòu)(如List控件下的item),便于底層相同depth下UI元素Batch头遭。

避免UI元素?cái)?shù)目過多和層次結(jié)構(gòu)過于復(fù)雜影響B(tài)atch更新速度寓免。

固定的Text考慮與背景圖層合在一張圖上(可能不便本地化,但可以減少drawcall)计维。

使用緩存池袜香,對緩存頻繁使用的元素。

部分內(nèi)容參考:http://gad.qq.com/article/detail/25947

HUD處理(動(dòng)靜分離)

Canvas重建就是為了合并DC鲫惶,將經(jīng)常變化的文字放在獨(dú)立的Canvas蜈首,手動(dòng)分離Canvas(會增加DC,不能和其它文字合并)欠母,但文字變化時(shí)其它Canvas就不需要重建欢策。

示例:名字和血條分開在兩個(gè)不同的節(jié)點(diǎn)下。這樣當(dāng)血條變化時(shí)赏淌,就不會引起名字的更新猬腰。如下圖所示:

2、設(shè)置scale為0猜敢,而不是設(shè)置active = false/true姑荷,或者添加Alpha Group,設(shè)置alpha=0/1

不勾選FillCenter

鏤空九宮格不勾選FillCenter缩擂,在Scene的Overdraw下可以查看到鼠冕,不勾選FillCenter,overdraw會減少胯盯。

少用Effect功能

少用Outline懈费,Tiled Sprite

outline額外生成7倍頂點(diǎn)

在一個(gè)空場景中,給Text添加outline之后博脑,頂點(diǎn)數(shù)大約是未添加之前的7.5倍憎乙。

去掉outline之后票罐,頂點(diǎn)數(shù)下降了很多。

Image不使用Tiled

type=simple時(shí)的頂點(diǎn)數(shù)

使用Tiled之后泞边,頂點(diǎn)數(shù)也上漲很多该押。

參考資料

Unity官方論壇發(fā)布 Unity UI性能優(yōu)化技巧

UGUI優(yōu)化:批次合并源碼分析及工具

工具:UI層級輔助工具,用于顯示UI的層級阵谚、批次等數(shù)據(jù)蚕礼,便于UI性能優(yōu)化。使用者可以結(jié)合以上規(guī)則梢什,分析當(dāng)前UI元素排列順序奠蹬、材質(zhì)貼圖設(shè)置,優(yōu)化UI Batching嗡午,減少UI Drawcall囤躁。

Unity UI優(yōu)化小結(jié)

重建 是UGUI優(yōu)化的關(guān)鍵 -- Unite2017嘉賓楊懷忠分享《UGUI深度優(yōu)化》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市荔睹,隨后出現(xiàn)的幾起案子割以,更是在濱河造成了極大的恐慌,老刑警劉巖应媚,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件严沥,死亡現(xiàn)場離奇詭異,居然都是意外死亡中姜,警方通過查閱死者的電腦和手機(jī)消玄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來丢胚,“玉大人翩瓜,你說我怎么就攤上這事⌒辏” “怎么了兔跌?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長峡蟋。 經(jīng)常有香客問我坟桅,道長,這世上最難降的妖魔是什么蕊蝗? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任仅乓,我火速辦了婚禮,結(jié)果婚禮上蓬戚,老公的妹妹穿的比我還像新娘夸楣。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布豫喧。 她就那樣靜靜地躺著石洗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪紧显。 梳的紋絲不亂的頭發(fā)上讲衫,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天,我揣著相機(jī)與錄音鸟妙,去河邊找鬼焦人。 笑死挥吵,一個(gè)胖子當(dāng)著我的面吹牛重父,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播忽匈,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼房午,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了丹允?” 一聲冷哼從身側(cè)響起郭厌,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎雕蔽,沒想到半個(gè)月后折柠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡批狐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年扇售,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嚣艇。...
    茶點(diǎn)故事閱讀 39,992評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡承冰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出食零,到底是詐尸還是另有隱情困乒,我是刑警寧澤,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布贰谣,位于F島的核電站娜搂,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏吱抚。R本人自食惡果不足惜涌攻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望频伤。 院中可真熱鬧恳谎,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至鸵膏,卻和暖如春膊升,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背谭企。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工廓译, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人债查。 一個(gè)月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓非区,卻偏偏與公主長得像,于是被迫代替她去往敵國和親盹廷。 傳聞我的和親對象是個(gè)殘疾皇子征绸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評論 2 355