Unity-性能優(yōu)化- 系列01

內(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)重要的屬性

  1. AllowRotation 是否支持精靈旋轉(zhuǎn)
  2. Tight Packing 是否支持密集型打包
  3. Filter Mode 貼圖的采樣模式
  4. Compression 壓縮方式
  5. 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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容