目錄
動態批處理:Unity自動地將滿足條件的物體網格合併,傳遞給GPU使用同一個材質進行渲染。
靜態批處理:運行開始階段把需要靜態批處理的模型合併到一個新的網格結構中,進行批量處理。
一、有哪些需要進行優化的?
1、CPU相關:Draw Call、網格重建
2、GPU相關:OverDraw
二、DrawCall
1、什麼是DrawCall?
在unity中,每次CPU準備數據並通知GPU的過程就稱之爲一個DrawCall。
2、爲什麼過多的Draw Call會造成卡頓?
在大多數情況下是因爲CPU準備數據的時間過長,數據包含但不限於:網格、紋理、着色器、頂點位置、頂點顏色、法線,導致GPU閒置。
3、如何減少DrawCall?
把多個DrawCall打包成一個DrawCall達到減少DrawCall目的,又稱批處理技術。
批處理分爲動態批處理和靜態批處理。
動態批處理:Unity自動地將滿足條件的物體網格合併,傳遞給GPU使用同一個材質進行渲染。
動態批處理條件:
3、3D物體的Scale分量不能出現負數。
4、着色器不能有多個Pass塊渲染,例如:渲染路徑爲ForwardAdd至少有2個Pass塊。
5、存在陰影投射時,MeshRenderer組件的陰影Receive Shadows屬性必須一致,即保證批處理的物體同時接收陰影或不接收陰影。
靜態批處理:運行開始階段把需要靜態批處理的模型合併到一個新的網格結構中,進行批量處理。
靜態批處理條件:
1、相同的材質。
2、大多數平臺上,批處理限制爲64k頂點和64k索引,OpenGLES上爲48k索引,在macOS上爲32k索引。
3、存在陰影投射時,MeshRenderer組件的陰影Receive Shadows屬性必須一致,即保證批處理的物體同時接收陰影或不接收陰影。
動態批處理和靜態批處理優缺點:
- •動態批處理節省內存,限制較多,消耗一定的性能。
- •靜態批處理限制較少,耗費內存。
靜態批處理通過將模型頂點轉換爲世界空間併爲其構建一個共享的頂點和索引緩衝區來工作,而動態批處理是每幀將模型頂點轉換到世界空間。
三、網格重建
網格重建是發生在每次渲染前對需要重建的UI元素進行重建的過程。
在UGUI源碼中,網格重建會在上一幀收集需要重建的UI元素,在當前幀渲染前進行排序元素列表,執行重建。
UI元素主要分爲Layout元素和Graphic元素。
Layout元素:HorizontalLayoutGroup、VerticalLayoutGroup、GridLayoutGroup、ScrollRect等。
Graphic元素:RawImage、Text、Image。
重建主要分爲Layout重建和Graphic重建,Layout重建有佈局前、佈局時、佈局後狀態,Graphic重建有渲染前、渲染後狀態。
1、Layout重建:
先自下而上地執行Layout元素的CalculateLayoutInputHorizontal/ CalculateLayoutInputHorizontal方法進行計算佈局大小、行數、列數等內容,接着自上而下地執行Layout元素的SetLayoutHorizontal/ SetLayoutVertical方法進行調整子物體的位置或調整自身大小等事情。
2、Graphic重建:
①更新網格:RawImage/Text/Image使用不同的形式獲取到網格數據,若有Shadow/Outline會對網格加工處理,再返回CanvasRenderer進行渲染。
②更新材質:設置材質個數,修改並設置材質,設置主紋理、Image的透明通道紋理。
可通過查看Profiler的Canvas.SendWillRenderCanvas函數來大致瞭解網格重建的開銷。
優化方法:
A)減少Rebuild的影響範圍,動靜分離,將動態元素放到一個新的Canvas中。
B)使用儘可能少的UI元素,檢查層級,刪除不必要的UI元素,達到減少深度排序的時間。
C)謹慎使用UI元素的enable和disable,因爲它們會觸發耗時較高的rebuild,可使用Layer層來顯隱UI 或 enable和disable它們的Canvas。
D)謹慎使用Text的Best Fit選項,Unity會爲Text使用過的所有字號生成圖元保存在altas裏,會增大內存壓力和增加額外的生成時間。
E)謹慎使用Canvas的Pixel Perfect選項,開啓後,在Canvas下的UI位置、大小信息變化後,會引起周圍其他UI進行微調大小,導致會有更多元素需要進行Rebuild。
可通過反射方式獲取CanvasUpdateRegistry的Layout列表和Graphic列表,獲知哪些元素觸發網格重建。
四、Overdraw
Overdraw是指屏幕上的某個像素在同一幀的時間內被繪製了多次。UWA分析報告中,以總填充總數來表達一幀內渲染的像素數量,過多Overdraw可能會引起GPU過載,影響動畫的播放和界面響應速度。可通過選擇Scene面板的Overdraw選項查看情況,進行針對性優化。
優化方法:
1、儘可能減少UI重疊部分。
2、減少帶透明通道的圖片非必要的透明部分,因爲Alpha爲0也會參與渲染。
3、儘可能使用全屏UI,全屏UI顯示後可隱藏背後的物體。
4、重疊較多的地方儘可能不重疊。
5、使用RectMask2D代替Mask,Mask的隱藏元素依然會渲染,而RectMask2D完全隱藏部分不會渲染,但部分隱藏的元素會渲染。
6、使用一個繼承於Graphic但不參與網格重建、緩存頂點和渲染的腳本,代替透明Image接受事件。