《Unity性能優(yōu)化》系列課程筆記——第拾節(jié)
Unity UI性能的四類問(wèn)題
Canvas Re-batch 時(shí)間過(guò)長(zhǎng)
Canvas Over-dirty, Re-batch次數(shù)過(guò)多
生成網(wǎng)格頂點(diǎn)時(shí)間過(guò)長(zhǎng)
Fill-rate overutilization
Canvas畫布
Canvas負(fù)責(zé)管理UGUI元素,負(fù)責(zé)UI渲染網(wǎng)格的生成與更新,并向GPU發(fā)送DrawCall指令。
Canvas Re-batch過(guò)程
根據(jù)UI元素深度關(guān)系進(jìn)行排序
檢查UI元素的覆蓋關(guān)系
檢查UI元素材質(zhì)并進(jìn)行合批
UGUI渲染細(xì)節(jié)
UGUI中渲染是在Transparent半透明渲染隊(duì)列中完成的,半透明隊(duì)列的繪制順序是從后往前畫,由于UI元素做Alpha Blend,我們?cè)谧鯱I時(shí)很難保障每一個(gè)像素不被重畫,UI的Overdraw太高,這會(huì)造成片元著色器利用率過(guò)高,造成GPU負(fù)擔(dān)。
UI SpriteAtlas圖集利用率不高的情況下,大量完全透明的像素被采樣也會(huì)導(dǎo)致像素被重繪,造成片元著色器利用率過(guò)高;同時(shí)紋理采樣器浪費(fèi)了大量采樣在無(wú)效的像素上,導(dǎo)致需要采樣的圖集像素不能盡快的被采樣,造成紋理采樣器的填充率過(guò)低,同樣也會(huì)帶來(lái)性能問(wèn)題。
Re-Build過(guò)程
在WillRenderCanvases事件調(diào)用PerformUpdate::CanvasUpdateRegistry接口
通過(guò)ICanvasElement.Rebuild方法重新構(gòu)建Dirty的Layout組件
通過(guò)ClippingRegistry.Cullf方法,任何已注冊(cè)的裁剪組件Clipping Compnents(Such as Masks)的對(duì)象進(jìn)行裁剪剔除操作
任何Dirty的 Graphics Compnents都會(huì)被要求重新生成圖形元素
Layout Rebuild
UI元素位置、大小、顏色發(fā)生變化
優(yōu)先計(jì)算靠近Root節(jié)點(diǎn),并根據(jù)層級(jí)深度排序
Graphic Rebuild
頂點(diǎn)數(shù)據(jù)被標(biāo)記成Dirty
材質(zhì)或貼圖數(shù)據(jù)被標(biāo)記成Dirty
使用Canvas的基本準(zhǔn)則:
將所有可能打斷合批的層移到最下邊的圖層,盡量避免UI元素出現(xiàn)重疊區(qū)域
可以拆分使用多個(gè)同級(jí)或嵌套的Canvas來(lái)減少Canvas的Rebatch復(fù)雜度
拆分動(dòng)態(tài)和靜態(tài)對(duì)象放到不同Canvas下。
不使用Layout組件
Canvas的RenderMode盡量Overlay模式,減少Camera調(diào)用的開銷
UGUI射線(Raycaster)優(yōu)化:
必要的需要交互UI組件才開啟“Raycast Target”
對(duì)于復(fù)雜的控件,盡量在根節(jié)點(diǎn)開啟“Raycast Target”