如何读懂UWA性能报告?—NGUI篇
拋磚引例
有別于之前家喻戶曉的暢銷大作,這次我們拿一個(gè)普通小清晰RPG游戲作為案例。在我們測(cè)試過的大量項(xiàng)目中,該游戲是少見的,以UI性能上位的。雖然這僅僅是第一次測(cè)試的數(shù)據(jù),但是其在CPU耗時(shí)、堆內(nèi)存分配上的表現(xiàn)都是甚如人意,瑕不掩瑜。
在UWA的報(bào)告中打開UI模塊性能界面,大家就能看到如上圖UI相關(guān)的詳細(xì)參數(shù)。包括:CPU峰值、CPU均值、堆內(nèi)存分配總值、堆內(nèi)存分配均值。這里的CPU峰值取自以下4個(gè)UI函數(shù)的耗時(shí)總和。堆內(nèi)存分配總值指測(cè)試過程中,這4個(gè)UI性能函數(shù)分配的堆內(nèi)存之和。
UICamera.Update()
該函數(shù)通常在點(diǎn)擊時(shí)出現(xiàn)開銷。因此,當(dāng)該函數(shù)的CPU開銷較高時(shí),通常都是因?yàn)檎{(diào)用了其他的較為耗時(shí)的函數(shù)引起。
UIRect.Update()
該函數(shù)通常在需要更新錨點(diǎn)位置時(shí)出現(xiàn)開銷。因此,當(dāng)該函數(shù)的CPU開銷持續(xù)較高時(shí),通常是因?yàn)楫?dāng)前場(chǎng)景中有較多的UI元素綁定了OnUpdate模式的錨點(diǎn)。
UIPanel.LateUpdate()
該函數(shù)為NGUI最主要的CPU開銷,包含了對(duì)所有UI界面包括其下UI元素的狀態(tài)更新、網(wǎng)格重建、DrawCall合并等操作。大量的UI變動(dòng)或者不合理的UIPanel布局都有可能導(dǎo)致該函數(shù)出現(xiàn)較高的峰值。
UIRect.Start()
該函數(shù)主要涉及到UI元素的初始化操作,通常在UI界面被實(shí)例化時(shí)出現(xiàn)并產(chǎn)生一定的CPU開銷。
報(bào)告往下看,是各個(gè)函數(shù)的具體CPU和堆內(nèi)存開銷。如果你對(duì)這些數(shù)據(jù)代表的數(shù)字是一臉懵逼的狀態(tài),不清楚是偏高了還是偏低了,請(qǐng)先打開右邊的分析與建議。
如下圖,紅框內(nèi)分別給出了四個(gè)函數(shù)的CPU占用詳情,包括主體范圍是多少,過高或過低。一般來說,我們建議堆內(nèi)存總值控制在30MB內(nèi),如果可以,盡量再往20MB的極限靠靠。
在此,我們不妨點(diǎn)擊某一幀,在底部查看該幀的CPU耗時(shí)。
上圖中顯示,在第5500幀時(shí)CPU的耗時(shí)為5.4ms,若要溯本求源,我們可以再去CPU耗時(shí)詳情中定位是哪個(gè)函數(shù)引起的CPU開銷。
如上圖,我們看到這些耗時(shí)分別為:
UICamera.Update(): 1.2 ms
UIRect.Update(): 0.2 ms
UIPanel.LateUpdate(): 4.0 ms
UIRect.Start(): 0.0 ms (由于四舍五入)
通過這些具體的性能函數(shù),以及這些函數(shù)的意義我們就可以大致做一個(gè)判斷了。接下來就需要各位程序大大結(jié)合自己的UI設(shè)計(jì)具體問題具體分析了。由于此文的目的是為了幫助大家理解UWA性能優(yōu)化報(bào)告,因而并不會(huì)大篇幅講解NGUI性能優(yōu)化的細(xì)則,下文先給一些比較通用的建議,可謂優(yōu)化中的黃金法則!
優(yōu)化支招
1、 盡可能將靜態(tài)UI元素和頻繁變化的動(dòng)態(tài)UI元素分開,存放于不同的Panel下。同時(shí),對(duì)于不同頻率的動(dòng)態(tài)元素也建議存放于不同的Panel中。
2、對(duì)于UI元素,OnEnable和OnDisable都會(huì)進(jìn)行較多的操作,因此即使不涉及到資源的加載,依然會(huì)有較大的CPU開銷,因此,對(duì)于切換非常頻繁的UI界面,我們建議更高效的做法是:
(1)改變UI的位置(以UIPanel為單位)來實(shí)現(xiàn)UI的隱藏和顯示,因?yàn)槭俏恢靡苿?dòng),所以并不產(chǎn)生多余的CPU消耗,同時(shí)又可以節(jié)省Enable和Disable的CPU開銷。
(2) 通過設(shè)置相機(jī)的Culling mask 來實(shí)現(xiàn) UI 界面的隱藏和顯示,同樣避免Enable/Disable操作。該做法可能會(huì)一定程度地提高內(nèi)存的開銷(UIDrawCall中存儲(chǔ)的Mesh),因此可以根據(jù)UI切換的頻率來決定是否要進(jìn)行優(yōu)化。
3、UI資源進(jìn)行詳細(xì)檢測(cè),查看其分辨率、格式等是否足夠精簡(jiǎn)和優(yōu)化。
今天的分享就到這里,下一期我們會(huì)繼續(xù)講解UWA測(cè)評(píng)報(bào)告中的內(nèi)存模塊,感謝各位開發(fā)者的關(guān)注。
總結(jié)
以上是生活随笔為你收集整理的如何读懂UWA性能报告?—NGUI篇的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Shell编程基础---shell的结构
- 下一篇: 入坑kotlin