Unity動態批處理和靜態批處理學習

本文轉自:http://blog.csdn.net/lyh916/article/details/45725499,請點擊連接查看樓主大神原文,尊重樓主版權。html

參考連接:Unity聖典:http://www.ceeger.com/Script/Mesh/Mesh.CombineMeshes.htmlpost

 

1、批處理性能

1.批處理的目的就是爲了減小DrawCall。DrawCall即CPU命令GPU去繪製。優化

2.若是咱們須要渲染一千個三角形,那麼把它們按一千個單獨的網格進行渲染所花費的時間要遠大於直接渲染一個包含了一千個三角形的網格。.net

3.要想使用批處理,須要物體有相同的材質。這是由於,對於使用同一個材質的物體,它們的不一樣僅僅在於頂點數據的差異,咱們能夠把這些頂點數據合併在一塊兒,再一塊兒發送給GPU,就能夠完成一次批處理。3d

4.在unity中,有兩種批處理:一是動態批處理,二是靜態批處理。htm

對於動態批處理,unity會自動完成,不須要咱們進行操做,並且物體是能夠移動的,可是動態批處理有許多限制條件。
對於靜態批處理,物體不可移動,可是限制條件不多。blog

 

2、動態批處理ip

原理:每一幀把能夠進行批處理的模型網格進行合併,再把合併後模型數據傳遞給GPU,而後使用同一個材質對其渲染。內存

限制:

1.頂點屬性要小於900。例如,若是shader中須要使用頂點位置、法線和紋理座標這三個頂點屬性,那麼要想讓模型可以被動態批處理,它的頂點數目不能超過300。所以,優化策略就是shader的優化,少使用頂點屬性,或者模型頂點數要儘量少。

2.多Pass的shader會中斷批處理。

3.在unity5中,動態批處理對於模型縮放的限制已經不存在了。

4.使用光照紋理的物體須要當心處理。爲了讓這些物體能夠被動態批處理,須要保證它們指向光照紋理中的同一位置。

 

3、靜態批處理

原理:只在運行開始階段,把須要進行靜態批處理的模型合併到一個新的網格中,這意味着這些模型數據不能夠在運行時刻被移動。

優勢:由於它只須要進行一次合併操做,所以比動態批處理更加高效。

缺點:須要佔用更多的內存來存儲合併後的幾何結構。

操做:將Inspector面板右上角的Static勾選(實際上只須要勾選Batching Static便可)

 

4、DrawCall

渲染統計窗口

Batches:至關於DrawCall

Saved by batching:經過批處理節省的DrawCall

SetPass calls:跟Shader中Pass的數量有關,Pass越多這個越大

Ps:當對場景中的物體進行修改時,有時須要點擊一下Game視圖,渲染統計窗口才會刷新。

 

5、影響DrawCall的因素:

1.Pass數量

新建一個場景,將天空盒改成純色,將平行光的陰影類型改成無。此時Batches值爲1,當禁用相機時,值爲0。


新建一個cube,新建一個材質和三個shader,其中OnePass含一個Pass,TwoPass含兩個,ThreePass含三個。將OnePass給材質,材質給cube。


而後依次將TwoPass和ThreePass給材質。


能夠看出,Pass越多DrawCall越大。能夠經過FrameDebugger來查看DrawCall,固然也能夠用Profiler,但後者不能查看DrawCall的具體狀況。




2.材質

a.在場景中放三個cube,cube材質爲一個pass

結論:通過動態批處理後,相同材質的物體只佔一個DC


b.將上面的cube改成Capsule

結論:對於頂點數太多的物體,沒法進行動態批處理,沒法減小DC


c.場景放兩個不一樣材質的cube

結論:不一樣材質的物體,沒法進行動態批處理,沒法減小DC


d.針對b狀況,勾選Static,而後點擊運行(不運行就沒法查看靜態批處理結果)

結論:對於頂點屬性太多的物體(>900),可使用靜態批處理來減小DC


合併以後的網格


e.那麼對於d,再添加一個不一樣材質的Sphere,勾選Static

結論:不一樣材質的物體,沒法經過靜態批處理減小DC。可是靜態批處理能夠經過合併網格來提升性能。


6、合併網格

建立一個空物體,確保縮放爲(1,1,1),在空物體下隨便建立一些物體。Ps:要使合併後不變形,就要確保根物體的縮放比例爲(1,1,1)

添加如下代碼到空物體上。

 

此處請查看原文

 

 

關於CombineMeshes:

 

void CombineMeshes(CombineInstance[] combine, bool mergeSubMeshes = true, bool useMatrices = true);

結合網格有利於性能最優化。若是mergeSubMeshes爲true,全部的網格會被結合成一個單個子網格。不然每個網格都將變成單個不一樣的子網格。若是全部的網格共享同一種材質,設定它爲真。若是useMatrices爲false,在CombineInstance結構中的變換矩陣將被忽略。

相關文章
相關標籤/搜索