參考文章:
UWA問(wèn)答:關(guān)于UI重建的一些問(wèn)題
UWA厚積薄發(fā):關(guān)于Unity中的UGUI優(yōu)化狭郑,你可能遇到這些問(wèn)題
??這篇的目的是記清楚UGUI中網(wǎng)格更新和重建(合并)兩個(gè)概念。
1才写、網(wǎng)格更新(對(duì)應(yīng)Canvas.SendWillRenderCanvases)
更新指的是UI元素本身的某些屬性發(fā)生變化葡兑,從而需要重新生成奖蔓,或者更新頂點(diǎn)屬性赞草。
總的來(lái)說(shuō),“網(wǎng)格更新”更新的是頂點(diǎn)屬性吆鹤。
??這里的頂點(diǎn)屬性厨疙,指的是UIVertex結(jié)構(gòu)的成員,也就是下面幾個(gè)變量疑务,其中常用的只有position和color兩個(gè)沾凄。清楚這一點(diǎn),要分辯哪些操作會(huì)引發(fā)更新就容易了知允。
Variables | Desc |
---|---|
UIVertex.color | Vertex color. |
UIVertex.normal | Normal. |
UIVertex.position | Vertex position. |
UIVertex.tangent | Tangent. |
UIVertex.uv0 | UV0. |
UIVertex.uv1 | UV1. |
在UGUI中顏色的變化是通過(guò)修改頂點(diǎn)色實(shí)現(xiàn)的
??修改Image撒蟀、Text的color屬性,會(huì)改變UIVertex.color温鸽;修改RectTransform的Size保屯、Anchors手负、Pivot等,會(huì)改變UIVertex.position姑尺,所以這些操作都會(huì)引發(fā)網(wǎng)格更新竟终。
??直觀感覺(jué)上,修改RectTransform(Transform)的Position切蟋、Rotation和Scale會(huì)改變頂點(diǎn)的position统捶。但測(cè)試下來(lái),這些操作不會(huì)帶來(lái)更新的開(kāi)銷(xiāo)柄粹,也不會(huì)改變頂點(diǎn)position喘鸟。根據(jù)打印出來(lái)的數(shù)據(jù)看,UIVertex.position記錄的是本地空間下的坐標(biāo)驻右,因此存儲(chǔ)值不會(huì)受到Transform屬性的影響迷守。
SendWillRenderCanvases
1)Graphic.Rebuild()
- UpdateGemotry()
- 改變RectTransform的Size
- UpdateMaterial()
- 修改Color
2)LayoutRebuilder.Rebuild()
2、網(wǎng)格重建/合并(對(duì)應(yīng)Canvas.BuildBatch)
在 UGUI 中旺入,Batch是以Canvas為單位的兑凿,即在同一個(gè)Canvas下的UI元素最終都會(huì)被Batch到同一個(gè)Mesh中。而在Batch前茵瘾,UGUI會(huì)根據(jù)這些UI元素的材質(zhì)(通常就是Atlas)以及渲染順序進(jìn)行重排礼华,在不改變渲染結(jié)果的前提下,盡可能將相同材質(zhì)的UI元素合并在同一個(gè)SubMesh中拗秘,從而把DrawCall降到最低圣絮。而B(niǎo)atch的操作只會(huì)在UI元素發(fā)生變化時(shí)才進(jìn)行,且合成的Mesh越大雕旨,操作的耗時(shí)也就越大扮匠。
??Unity的文檔把這個(gè)問(wèn)題說(shuō)的更加明確。
Important reminder: Whenever any drawable UI element on a given Canvas changes, the Canvas must re-run the batch building process. This process re-analyzes every drawable UI element on the Canvas, regardless of whether it has changed or not. Note that a “change” is any change which affects a UI object’s appearance, including the sprite assigned to a sprite renderer, transform position & scale, the text contained in a text mesh, etc.
重要提示:當(dāng)給定Canvas上的任何可繪制UI元素發(fā)生更改時(shí)凡涩,Canvas必須重新執(zhí)行合批過(guò)程棒搜。此過(guò)程重新分析Canvas上的每個(gè)可繪制UI元素,不管它是否被修改活箕。注意力麸,“更改”是指影響UI元素外觀的任何變動(dòng),包括修改sprite renderer的sprite育韩、transform的position和scale克蚂、文本網(wǎng)格的text等。
??綜上筋讨,只要UI元素變了埃叭,就會(huì)引發(fā)網(wǎng)格重建(BuildBatch);只有當(dāng)元素的頂點(diǎn)屬性發(fā)生變化悉罕,才會(huì)出現(xiàn)網(wǎng)格更新(SendWillRenderCanvases)赤屋。重建出現(xiàn)的頻率應(yīng)該是高于更新的误墓,因?yàn)楦驴偸前殡S著重建。
??根據(jù)我不太靠譜的測(cè)試益缎,更新的開(kāi)銷(xiāo)普遍高于重建谜慌,可能是由于重建在Native中執(zhí)。