
內(nèi)子所畫(huà)
優(yōu)化整理
UGUI圖集相關(guān)優(yōu)化
對(duì)于正常使用的Image,在場(chǎng)景中每添加一個(gè)Image,都會(huì)調(diào)用一次DrawCall來(lái)讓GPU進(jìn)行繪制。如果繪制100個(gè)Image,就需要100個(gè)DrawCall,太消耗性能
-
開(kāi)啟圖集
我們需要在設(shè)置中開(kāi)啟圖集 Edit->Project Setting->Editor
Disabled:不啟用圖集
Enabled For Builds:只在打包時(shí)啟用
Always Enabled:永遠(yuǎn)啟用
剩下的兩個(gè)都是舊版圖集的使用方式,我們不用學(xué)習(xí),遲早會(huì)棄用的 -
創(chuàng)建圖集
Project視圖中右鍵創(chuàng)建一個(gè)SpriteAtlas

說(shuō)點(diǎn)重要的屬性
- AllowRotation 是否支持精靈旋轉(zhuǎn)
- Tight Packing 是否支持密集型打包
- Filter Mode 貼圖的采樣模式
- Compression 壓縮方式
- Objects for Packing中可以添加需要打包的圖片和圖集
注意圖集和圖片都不建議放在Resources下,然后點(diǎn)擊PackPreview就可以生成圖集了,很簡(jiǎn)單把
-
圖集dc相關(guān)
三種圖片,分別設(shè)置為兩個(gè)圖集,且三個(gè)圖片交叉重疊,DC為3卻不是2。
Unity會(huì)按照Hierarchy層級(jí)順序從上向下渲染,所以最下面的UI一般會(huì)渲染在最前面。
但是如果UI之間產(chǎn)生了交叉重疊的情況,圖集的合批會(huì)在不同圖集重疊的地方被打斷,所以就產(chǎn)生了3個(gè)DrawCall。
解決方案:
1、不同UI之間盡量不要重疊。
2、不同圖集的圖片不要交叉使用。
3、Image與Text不要交叉使用,Text盡量放在所有Image的上面,即Hierarchy的最下面(當(dāng)然你要合理規(guī)劃)
4、Hierarchy層級(jí)關(guān)系做分層處理,每一個(gè)Atlas的圖片放在同一個(gè)層里。
5、不使用UnityWhite等默認(rèn)圖片,會(huì)打斷合批。
6、不要設(shè)置PosZ。
7、有時(shí)可以故意在底下放一張透明圖片,墊高層級(jí)使得合批
8、與添加Outline、Shadow等腳本無(wú)關(guān)。
UGUI其他優(yōu)化
-
Canvas
Canvas下所有的UI元素都是合在一個(gè)Mesh中的。
過(guò)大的Mesh在更新時(shí)會(huì)開(kāi)銷很大,復(fù)雜的UI界面應(yīng)該自成一個(gè)Canvas。
但是過(guò)多的Canvas會(huì)導(dǎo)致Draw Call的上升。
動(dòng)態(tài)元素會(huì)導(dǎo)致Canvas的Rebuild(mesh更新),要做到動(dòng)靜分離。
Set Dirty,UGUI會(huì)在這一幀收集所有的修改,統(tǒng)一進(jìn)行處理。
-
Scroll Rect
滾動(dòng)的時(shí)候會(huì)觸發(fā) Canvas.SendWillRenderCanvases。
應(yīng)該是開(kāi)啟了 Pixel Perfect的選項(xiàng),作用是UI元素在位移時(shí),為了對(duì)齊像素長(zhǎng)寬進(jìn)行微調(diào)。
而Scroll Rect里面元素很多,導(dǎo)致開(kāi)銷很大。
-
Outline等內(nèi)置組件
會(huì)導(dǎo)致文本的Mesh增加四倍,導(dǎo)致開(kāi)銷變大。
-
界面切換
打開(kāi)新界面隱藏原有界面。
如果先把原來(lái)的SetActive(false),再把后續(xù)的SetActive(true),會(huì)產(chǎn)生GC.Alloc。
可以改 Position 或者 Layer 或者 CanvasGroup。
-
少用Mask
Mask實(shí)現(xiàn)使用GPU Shader實(shí)現(xiàn)的,根據(jù)Image的a值在底層模板繪制一個(gè)區(qū)域的指令,確定裁剪區(qū)域。
之后Mask節(jié)點(diǎn)下的所有元素都會(huì)根據(jù)這個(gè)區(qū)域計(jì)算a值(模板測(cè)試)。
會(huì)額外產(chǎn)生2個(gè)DrawCall:
1.繪制模板區(qū)域。
2.結(jié)束計(jì)算裁剪。
Mask內(nèi)部元素不會(huì)跟外界元素進(jìn)行合批。
Mask內(nèi)部可以和其他Mask內(nèi)部元素進(jìn)行合批。
-
RectMask2D
其實(shí)現(xiàn)方式是通過(guò)CPU,裁剪區(qū)域是矩形,如果在區(qū)域內(nèi)就進(jìn)行正常操作。
如果不在矩形區(qū)域,則這個(gè)元素不會(huì)被渲染。(且Draw Call 為 0)
RectMask2D也是負(fù)責(zé)裁剪。
RectMask2D內(nèi)部元素不會(huì)與任何外部元素進(jìn)行合皮。
RectMask2D不會(huì)產(chǎn)生額外Draw Call。
-
關(guān)閉無(wú)用的Raycast Target
Graphic Raycaster 實(shí)現(xiàn)原理是遍歷所有Raycast Target 勾選的組件。
然后進(jìn)行一系列測(cè)試,如果通過(guò)了測(cè)試,就會(huì)加入到命中列表中。
再進(jìn)行排序,獲取第一個(gè)命中的組件,進(jìn)行調(diào)用。
所以不需要接受事件處理的組件,取消勾選Raycast Target。
-
OverDraw
大量粒子特效和透明材質(zhì),多層疊加。
GPU要進(jìn)行多次深度測(cè)試。
會(huì)導(dǎo)致手機(jī)發(fā)熱
參考文章
http://www.itdecent.cn/p/1c14ce9e5210
https://zhuanlan.zhihu.com/p/109200416
http://www.itdecent.cn/p/a3087f31ff88
https://www.dazhuanlan.com/2019/12/06/5de9e843b9860/
https://blog.csdn.net/qq_36848715/article/details/80424019?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.control

