1. 程式人生 > >Unity 效能優化,DrawCall、渲染順序、打包圖集、特效清理、程式碼優化

Unity 效能優化,DrawCall、渲染順序、打包圖集、特效清理、程式碼優化

 

Drawcalls

drawcallCPU對底層圖形繪製介面的呼叫命令GPU執行渲染操作,渲染流程採用流水線實現,CPUGPU並行工作,它們之間通過命令緩衝區連線,CPU向其中傳送渲染命令,GPU接收並執行對應的渲染命令。

降低Draw Call的方法主要是減少渲染物體的材質種類,並通過Draw Call Batching來減少其數量,需要注意的是,遊戲效能並非Draw Call越小越好。這是因為決定渲染模組效能的除了Draw Call之外,還有用於傳輸渲染資料的匯流排頻寬。當我們使用Draw Call Batching將同種材質的網格模型拼合在一起時,可能會造成同一時間需要傳輸的資料(Texture、VB/IB等)大大增加,以至於造成頻寬“堵塞”,在資源無法及時傳輸過去的情況下,GPU只能等待,從而反倒降低了遊戲的執行幀率。

渲染順序

U3D的渲染是有順序的,U3D的渲染順序是由我們控制的,控制好U3D的渲染順序,你才能控制好DrawCall

https://blog.csdn.net/qq_14939027/article/details/54708264 文章來源)

 

打包圖集

每個材質/紋理的渲染一定是會產生DrawCall的,這個DrawCall只能通過打包圖集來進行優化

製作圖集一般遵循幾個規則

  • 從功能角度進行劃分,例如UI可以劃分為公共部分,以及每個具體的介面,功能上,顯示上密切相關的圖片打包到一起
  • 不要一股腦把所有東西打包到一個圖集裡,特別是那些不可能同時出現的東西,它們就不應該在一個圖集裡,這樣的圖集意義不大,減少不了DrawCall,並且一個你不需要顯示的圖片,會一直佔用你的記憶體
  • 注意控制圖集的大小,不要讓圖集太大,一個超級大圖集的DrawCall消耗或許頂的上十幾個小圖集的消耗
  • 字元圖集,在使用BMFont或者其他工具生成圖片字的時候,我們往往是直接匯入一大串文字,然後直接生成圖片,但實際上這上面的操作也有優化空間,例如BMFont生成的圖片大小,是可以設定的,有兩個規則,一個規則是匯出的圖片儘量小,另一個是匯出的圖片儘量少,預設的大小應該是512×512,假設你生成的圖片256×256就可以容納,那麼多做一個操作你可以節省這麼多空間,另外當你輸入多幾個字,就導致增加一張圖片時,例如1024變成2048,那麼你可以考慮使用3張512的圖片,這樣也會節省空間
  • 經過精心劃分的圖集在加上精心規劃的渲染順序,DrawCall會有一個質的優化

特效清理

那麼特效播放完,這個特效我們就看不到了,但假設這個特效在播放結束的時候,沒有將自身的Active屬性設定為false,那麼它就會繼續佔用你的DrawCall,消耗你裝置的計算能力,所以程式需要保證當一個特效播放完之後,能夠被消耗,或者設定為非啟用的狀態,可以使用一些公共方法來完成特效播放完之後的清理工作(自己實現2個靜態函式,一個播放完銷燬,一個播放完設定未啟用)

Unity在執行時可以將一些物體進行合併,從而用一個繪製呼叫來渲染他們。這一操作,我們稱之為批處理。一般來說,Unity批處理的物體越多,你就會得到越好的渲染效能。

只有擁有相同材質的物體才可以進行批處理。因此,如果你想要得到良好的批處理效果,你需要在程式中儘可能地複用材質和物體。

動態批處理

如果動態物體共用著相同的材質,那麼Unity會自動對這些物體進行批處理。

動態批處理操作是自動完成的,並不需要你進行額外的操作。

 

 靜態批處理

 

 Saved by batching 值過大   ---- > 這個值主要是針對Mesh的批處理,這個值越高,應用就越卡  

 

 程式碼的優化