unity中動態批處理限制的頂點數是根據什麼來計算的?

目前我了解到的是,在有法線的情況下,1套UV在300頂點數以內可以進行動態批處理,2套UV在180頂點數以內可以進行動態批處理,那1套UV和2套UV在頂點數限制的區別是由什麼原因造成的?2套以上和2套UV相比會有其他變化嗎?


瀉藥。文檔里寫的很清楚啊,是頂點屬性(vertex attributes)的數量限制是900,而非直接限制頂點數量本身。

因此,如果用到了Vertex Position, Normal and single UV,那麼限制就是900/3 = 300個頂點

如果再增加幾個屬性,Vertex Position, Normal, UV0, UV1 and Tangent,那麼限制就是900/5=180頂點了。

Draw call batching


回答點額外的。

這個動態批處理其實就是每幀用CPU把本地坐標合併乘到世界坐標去,所以你在Shader拿到的本地頂點坐標就是世界坐標。

不過這個過程估計C做的,並不慢。而且大部分情況相比DC增加是合算的。

搞個這樣的限制是怕被濫用。覺得合併小模型節約的DC時間至少高於900浮點的數據計算,這樣中庸的想法(也就是你模型真超過或者接近這個額度,沒必要硬拆開成兩份便於合併。DC也就是費CPU,大網格合併也是費CPU,左手騰右手而已並無卵用,減少整體多邊形數量才是實在的)。

所以場景盡量用靜態Batching,這個其實也是CPU合併,但不會每幀都合(裁剪區域變化時才處理)。新版本取消了靜態Batching網格合併,而是通過減少SetPass數量來batch,增加了性能。

目前還加了個GPU Instance,ES3.1的高級特性,僅限制必須同Shader(同Pass),無網格限制,但是有材質/參數的總合併上限,挺高的無所謂。其實就是將Matrix和材質參數合併扔到了VBO里,然後Shader在頂點上存了index,再每個頂點(或者像素)根據index去取值,然後用於計算,原理上效率很高。

但機器要支持ES3.1才行啊。


推薦閱讀:

unity的c#腳本和標準的c#語言有什麼區別和聯繫?unity是僅僅使用了c#的語法嗎?
學習Unity3D有什麼比較好的資料嘛?
unity在ios平台下內存的優化?
C#如何向C++生成的dll文件中傳遞二維數組?
零基礎學unity3d需要培訓么?

TAG:Unity遊戲引擎 |