UGUI batch 規則和性能優化
UGUI batch 規則和性能優化
(基礎) Unity 繪圖性能優化 - Draw Call Batching : http://docs.unity3d.com/Manual/DrawCallBatching.html
1.名詞
1)Batch 單詞 google 翻譯的解釋是:批量、批次。
2)Stats中的Batches參數:意思是batching後產生的批次數。(其實每一個批次就會調用一次DrawCall)
3)Unity官方文檔中的batching是指batch操作和batching技術的稱呼。(這裏的batching是指“將符合條件的mesh通過CPU變換到統一的世界坐標中”這個操作,也就是合並mesh為一個批次的意思)
2.UGUI 中所有顯示物體的網格都是自己填充的,例如Image,UGUI會自動生成四個頂點,和代表兩個三角形的頂點索引。所有顯示物體如果不設置它的material都會使用同一個默認材質(shader:“UI/Default”,color:RGBA(1,1,1,1),pass count:1,render queue:3000)
3.所以,根據官方文檔DrawCallBatching可知,UGUI非常符合DynamicBatching。但是有一點是不符合的那就是UI的圖片,所以我們可以把圖片打成一張大圖集來達到DynamicBatching的效果。這樣就能減少batching後的batches個數,也就減少了DrawCall次數。
4.因為UI部分涉及的圖片比較多,如果打一個圖集在提交到GPU的時候會占用很大的內存,所以一般UI圖集都會根據一定的規則進行,texture atlasing。
5.所以一般我們看到的UGUI優化方案,都是基於這些點來說的。這些知識點明白了,才知道為什麽要做texture atlasing,為什麽要分層,什麽時候要合並等等。
UGUI排序規則
1.相鄰的層級如果它們的texture在一個atlas中,就會被batching到一起。
2.在同一個層級區間並且沒有交叉區域的物體(遮擋會按組件的transform的矩形區域計算),如果texture在一個atlas中,就會被batching到一起。
我們要做的事
1.對於atlas總來的來說就是讓同一時刻,UI中平均包含的atlas盡可能少。
經常用的圖片要打成一個atlas。
2.其他atlas按功能劃分。比如,背包界面,除了公用圖集中出現的元素以外,所有出現的圖片都打成一個atlas。
3.可重用的組件盡量在前期就都考慮到,因為到後期可能會產生混亂,同一個按鈕在A界面出現也在B界面出現。(當然除了為了減少draw call這麽做以外)
4.如果在某種情況下對頂點數限制不高,可以考慮將圖片做成對稱的,然後用原圖的一半拼出想要的效果
5.對於drawcall來說,我們UI中有N層,N越大越靠前,會遮住後面的組件。我們從0到N數,然後看每個組件的材質,我們要盡量讓這個材質變化的次數減少。
6.相同圖集的組件在不影響最終效果的情況下盡量使得相同圖集的組件相鄰。
7.相同字體的文本控件在不影響最終效果的情況下勁量使得相同字體的組件相鄰。
8.對於不同的圖集盡量不要去穿插,字體也是一樣(縱向交叉,Herichy中的順序)。
9.如果UI元素可以沒有交叉區域盡量不交叉,特別是文字。(橫向交叉,矩形區域的交叉)
10.如果可能的話可以把層疊交叉的文字做到圖片中
11.如果不用mask可以實現的功能盡量不用。Mask組件用到了透明,所以他會被繪制兩次。所以,帶mask的組件不適用dynamic batching的規則。
UGUI batch 規則和性能優化