Unity效能優化 DrawCall

2022-01-12 15:12:19 字數 1922 閱讀 6018

1. drawcall是啥?其實就是對底層圖形程式(比如:opengl es)介面的呼叫,以在螢幕上畫出東西。所以,是誰去呼叫這些介面呢?cpu。比如有上千個物體,每乙個的渲染都需要去呼叫一次底層介面,而每一次的呼叫cpu都需要做很多任務作,那麼cpu必然不堪重負。但是對於gpu來說,圖形處理的工作量是一樣的。所以對drawcall的優化,主要就是為了盡量解放cpu在呼叫圖形介面上的開銷。所以針對drawcall我們主要的思路就是每個物體儘量減少渲染次數,多個物體最好一起渲染。

2. 優化方式

(1)draw call batching

採用批處理方式,unity在執行時可以將一些物體進行合併,從而用乙個描繪呼叫來渲染他們。

在這裡使用時,遇到了坑,很多資料都沒有提及到,在預設情況下,unity是沒有開啟的,需要在player settings中進行設定的:

用了乙個不錯的例子來看,

for(int i = 0; i < 500; i++)

動態批處理的結果是非常明顯的(塔防遊戲中估計能提高不少效率)

drawcall的動態批處理存在著很多約束,所以預設是關閉的

a.  需要在每個頂點上進行一定的開銷,所以動態批處理僅支援小於900頂點的網格物體;

b.著色器使用頂點位置,法線和uv值三種屬性,那麼你只能批處理300頂點以下的物體;如果你的著色器需要使用頂點位置,法線,uv0,uv1和切向量,那你只能批處理180頂點以下的物體(這個地方不懂);

c.不要使用縮放。分別擁有縮放大小(1,1,1) 和(2,2,2)的兩個物體將不會進行批處理

d.統一縮放的物體不會與非統一縮放的物體進行批處理

e.用縮放尺度(1,1,1) 和 (1,2,1)的兩個物體將不會進行批處理,但是使用縮放尺度(1,2,1) 和(1,3,1)的兩個物體將可以進行批處理

f.使用不同材質的例項化物體(instance)將會導致批處理失敗;

g.擁有lightmap的物體含有額外(隱藏)的材質屬性,比如:lightmap的偏移和縮放係數等。所以,擁有lightmap的物體將不會進行批處理(除非他們指向lightmap的同一部分)。(什麼是lightmap)

h.多通道的shader會妨礙批處理操作。比如,幾乎unity中所有的著色器在前向渲染中都支援多個光源,並為它們有效地開闢多個通道。

i. 預設體的例項會自動地使用相同的網格模型和材質。

3. 打包圖集

每個材質/紋理的渲染一定是會產生drawcall的,這個drawcall只能通過打包圖集來進行優化,例如在2d遊戲中使用了2張,它的資料為:

在unity中,window->2d->sprite packer,先轉到editor settins中進行設定:

這次的結果,明顯減少了一次draw batch:

Unity 效能優化

unity效能問題 vss virtual set size,虛擬耗用記憶體。它是乙個程序能訪問的所有記憶體空間位址的大小。這個大小包含了 一些沒有駐留在ram中的記憶體,就像mallocs已經被分配,但還沒有寫入。vss很少用來測量程式的實際使 用記憶體。rss resident set size...

unity效能優化2

1 效能優化的是 低幀率或者高記憶體占用 通過unity profiler 我們知道誰占用cpu多少時間,遊戲如何使用記憶體 左側的是cpu使用情況,gpu,渲染,記憶體,聲音。下半部分顯示當前幀的詳細情況 1 如果遊戲執行的慢,我們首先看cpu,看誰占用了他大量的時間 a resources目錄下...

unity效能優化 CPU

影響效能的因素 對於乙個遊戲來說,有兩種主要的計算資源 cpu和gpu,它們會互相合作,來讓我們的遊戲可以在預期的幀率和解析度下工作。cpu負責其中的幀率,gpu主要負責解析度相關的一些東西。本篇會介紹cpu的優化技巧 作用 計算。主要是在蒙皮骨骼計算,布料模擬,頂點動畫,粒子模擬等,還有在各種頂點...