規則總結:

在NGUI中優化drawcall的最優先解決方案原則:盡量少穿插使用不同圖集,減少DC合併的打斷

UITexture盡量只在大圖的情況下用,能用圖集就用圖集

不同的字體都使用一個depth,並且這個depth最好不要與圖片sprite有交叉,最好放在最上層


優化步驟:

I、運行遊戲,打開想要排查的界面

II、打開NGUI工具 Panel Tool,找到對應UI名,右側有幾項參考數據,分別是WG(widget數量),DC(drawcall數量),Clip(是否裁切),Tris(三角形數量)

III、關注DC指標,可以觀察到該界面的DC為12

再打開NGUI工具 Draw Call Tool,發現,在優化前目前運行狀態下一共有38個DC,該界面是從3開始直到14,一共12個

主要的目的是 通過合併DC達到減少DC數量,具體的做法是

1、查看間隔的DrawCall是否使用了相同的材質球

2、如果相同的話,再查看具體的widgets,是否存在可改動的層級設置,可以工具中的Widgets,定位到該DC下具體的控制項

IV.優化後

檢查發現有部分Label層級設置問題,導致使用UI_New圖集的widget無法合併DrawCall,第一次優化後,將DC從12降低到了9

優化後繼續查看DrawCallTool,發現這幾個DC由於UI_A8和UI_New的互相打斷,存在合併的可能

第二次優化後,繼續通過設置widget的層級,將UI_A8和UI_New的打斷解除,使得UI_New都在一個DC中,最終將DC降到了7


關於UI中的DC需要知道的幾個問題

什麼是DC?

在Unity中,每次引擎準備數據並通知GPU的過程稱為一次Draw Call。

DrawCall是CPU調用底層圖形介面。每一個的渲染都需要去調用一次底層介面,而每一次的調用CPU都需要做很多工作,那麼CPU必然不堪重負。但是對於GPU來說,圖形處理的工作量是一樣的。所以對DrawCall的優化,主要就是為了盡量解放CPU在調用圖形介面上的開銷。

NGUI是如何決定控制項的渲染順序?

每一個UIWidget的顯示順序由depth值決定,跟z軸沒關係,而這個depth值是由兩部分組成的

UIWidget所在的UIPanel的depth和UIwidget自身的depth值

為什麼圖集能減少DC?

圖集的功能是,將密切相關的圖打到一起,使用同一個材質,使得存在DC合併的可能。

打成圖集後是否就真的能降低DC?

需要控制好渲染順序,減少渲染被打斷,才能控制DC,在NGUI下,統一使用depth來進行渲染順序的控制

一個比較好理解的例子:

假設3個對象使用不同的材質/紋理,那麼無疑會產生3個DrawCall

這3個對象使用2個材質,A和B使用材質1,C使用材質2,這時候來看,應該是只有2個DrawCall,或者3個DrawCall

但發現有時候是2個,有時候是3個。具體原因就是和渲染順序有關

1.渲染A,使用材質1

2.渲染B,使用材質1

3.渲染C,使用材質2

在這種情況下是2個DrawCall

在下面這種情況下,則是3個DrawCall

1.渲染A,使用材質1

2.渲染C,使用材質2

3.渲染B,使用材質1

沒有控制好渲染順序(或者說沒有去特意控制),所以導致了額外的DrawCall。因為A和B不是一次性渲染完的,而是被C打斷了,所以導致材質1被分為兩次渲染


參考閱讀:

cnblogs.com/smallboat/p

cnblogs.com/123ing/p/40

UWA《NGUI開發優化技巧》視頻 v.qq.com/x/page/j0336jn


推薦閱讀:
相关文章