渲染速率優(yōu)化
?說道UI的優(yōu)化肯定要說到 Drawcall绑莺,但其實Drawcall的優(yōu)化也有很多的注意事項。
Drawcall注意事項
1 unity的Drawcall受畫布惕耕,Pannel 纺裁,在NGUI中也會受UIwidge的depth的影響,也就是說在不同的畫布司澎,pannel等下欺缘,兩個圖片即使是相同的圖集,也會有兩個Drawcall挤安,
2? 應(yīng)為unity的繪制機(jī)制是浪南,從history中從上到下依次遍歷,取材質(zhì)相同沒有中間層的放到一次draw call中漱受,所以當(dāng)兩張圖片的材質(zhì)不同的時候,和有中間層的時候會額外消耗一次drawcall(中間層”是具有不同材料的圖形對象,其邊界框與兩個其他可混合對象重疊昂羡,并且放置在兩個可混合對象之間的層次結(jié)構(gòu)中絮记。中間層迫使批次被破壞),所以盡量少使用組合的圖片虐先,這樣浪費多輛的Drawcall怨愤。
3??Drawcall也會受Y軸的影響(在上面都一樣的情況下,在兩個相同圖集的圖片中仿佛Y軸不同的圖片蛹批,也會增加一個Drawcall)撰洗,但是NGUI并不會,(只受UIwidge的depth)腐芍。
4 圖集的圖片也并不是越多越好差导,使用圖集是為了減少向GPU傳遞的次數(shù),因為每一次傳遞給GPU的耗時都會很長猪勇。但是如果一個超大的圖集设褐,呢么就會造成通往GPU的通道阻塞,反而會降低速率泣刹。
填充率優(yōu)化
1? 如果想使用圖片隱藏不要把a(bǔ)lpha設(shè)置為0助析,這樣不會減少draw call,只有把gameobjct失活或者image失活才行椅您。
2 有全屏的UI功能出現(xiàn)時外冀,最好把被遮擋的UI界面隱藏掉,畢竟攝像機(jī)無論看不看得到掀泳,都會渲染到界面中雪隧。
3 禁用一些無用的攝像機(jī),同樣時出現(xiàn)全屏的UI時开伏,把一些無用的攝像機(jī)禁用膀跌,因為只要攝像機(jī)拍到的,就會渲染固灵,消耗Unity的性能捅伤。
4 unity重建,重建的過程是將畫布的所有圖片的布局和mesh(大小巫玻,縮放)重新計算一邊丛忆。當(dāng)畫布變臟的時候,unity就會將整個畫布重建(變臟是指影響UI對象外觀的任何更改仍秤,包括分配給精靈渲染器的精靈熄诡,變換位置和比例,文本網(wǎng)格中包含的文本等)诗力,所以當(dāng)一個畫布擁有大量的UI元素的時候凰浮,每當(dāng)有任意一個元素改變就會進(jìn)行大量的計算,很是浪費性能。所以盡量一個功能一個畫布袜茧。
5? untiy的點擊事件點擊的時候菜拓,是遍歷具有或者是任何ICanvasRaycastFilter組件的子級(在任何深度),并且該Raycast Filter組件允許Raycast(意思是 在場景中所有具有Raycast的組件笛厦,都會遍歷纳鼎,在一些需要大地圖地塊的游戲中,將會是一個致命消耗)裳凸。??實現(xiàn)一個組件贱鄙,在組件創(chuàng)建時Raycast默認(rèn)改為false。
內(nèi)存優(yōu)化
1 使用unity自帶的sliced姨谷,Tiled逗宁,filled功能,將圖片進(jìn)行變化成自己需要的圖形菠秒。例如 背包的格子都是重復(fù)的疙剑,這時候完全可以用一個格子圖片代替,然后使用tiled擴(kuò)大重復(fù)就行了践叠。(原則是美術(shù)盡量少給圖言缤,每一張圖片都能有多重用途)
2 iOS平臺使用PVRT壓縮紋理,Adroid平臺使用ETC1格式壓縮禁灼。均可以減少3/4的內(nèi)存管挟。優(yōu)化效果很明顯。(ETC1值能支持非Alpha通道弄捕,所以一般先把Alpha通道圖分離出來僻孝,當(dāng)繪制時a值從Alpha圖獲取,而ETC2不需要守谓,但是支持的機(jī)型較少穿铆。)
3 minmap的原理是創(chuàng)造出適合不同距離的圖片,開啟minmap會很占內(nèi)存斋荞,所以在UI上面就不要使用荞雏,minmap這個功能。
4 手動控制GC的釋放平酿,減少因為GC一次釋放過多而造成的卡頓(可以每半分鐘一次)凤优。