NGUI 減小drawcall規則

前置說明一:測試

Unity中的drawcall定義:spa

每次引擎準備數據並通知GPU的過程稱爲一次Draw Call。內存

Unity(或者說基本全部圖形引擎)生成一幀畫面的處理過程大體能夠這樣簡化描述:引擎首先通過簡單的可見性測試,肯定攝像機能夠看到的物體,而後把這些物體的頂點(包括本地位置、法線、UV等),(頂點如何組成三角形),變換(就是物體的位置、旋轉、縮放、以及攝像機位置等),相關光源,紋理,渲染方式(由材質/Shader決定)等數據準備好,而後通知圖形API——或者就簡單地看做是通知GPU——開始繪製,GPU基於這些數據,通過一系列運算,在屏幕上畫出成千上萬的三角形,最終構成一幅圖像。資源

 

前置說明二:開發

NGUI中的UIWidget的顯示順序:get

每個UIWidget的顯示順序由depth值決定,跟z軸不要緊,而這個depth值是由兩部分組成的,一個是UIWidget所在的UIPanel的depth和UIwidget自身的depth值進行加權計算。it

而且,UIPanel的權重很是大,能夠認爲,UIPanel的depth大的全部UIWidget比UIPanel的depth小的全部UIWidget比最後計算的depth必定大。舉個例子:渲染

 

UIPanel1    depth  x                      UIPanel2    depth  y引用

UIWidget1  depth  m                      UIWidget2  depth  ncall

 

只要 x > y,那麼無論m和n的大小,UIWidget1最後的depth必定大於UIWidget2。

 

減小drawcall的規則:

一、同一個UIPanel下的texture和font儘可能放在同一個altals下。也表達了另一個意思,使用同一個altals的元素儘可能放在同一個UIPanel下面。

二、若是一個UIPanel下面使用了多個altals,那麼儘可能讓使用相同altals的元素連續,儘可能避免altals交叉。

 

規則1的前半部分好理解。後半部分,參照前面顯示順序問題能夠知道。若是使用同一個altals的元素在兩個不一樣的UIPanel下面,這就必然致使它們的drawcall分離。因此即便調整它們的depth一致,也沒法合併成一個drawcall.

 

規則2的意思,舉個例子就明白了:

同一個UIPanel下有4個UIWidget,w1,w2,w3,w4。

其中 W1和W2引用altals1。

其中 W3和W4引用altals2。

 

若是它們的depth順序爲  w1 : 1,w2 :2,w3 : 3,w4 : 4。

那麼整個渲染須要2個drawcall,由於渲染順序爲 w1,w2,w3,w4。

而w1和w2公用一個altals,因此能夠合併成一個drawcall,同理w3和w4能夠合併成一個drawcall。

 

而若是它們的depth順序爲: w1 : 1,w2 :3,w3 : 2,w4 : 4。

那麼整個渲染須要4個drawcall,由於渲染順序爲 w1,w3,w2,w4。

由於w1和w3不是公用一個altals,因此只能分開渲染。同理w3和w2,w2和w4也只能分開渲染。

 

UI製做強調說明:

使用NGUI製做UI有兩大需求,
1 要打開界面要快 因此必須一直存在內存中
2 設置好公共資源 這是減小內存的佔用

還有就是公共資源與界面之間的深度問題

NGUI沒法導入問題:

導入時閃一下就消失沒有反應

這是因爲放在中文目錄的緣由,必須放在英文路徑下才可導入

因爲unity對中文並無很好的支持

因此unity開發過程當中應儘可能避免使用中文路徑或文件名

相關文章
相關標籤/搜索