前置說明一:測試
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開發過程當中應儘可能避免使用中文路徑或文件名