Unity3D性能优化之Draw Call Batching
生活随笔
收集整理的這篇文章主要介紹了
Unity3D性能优化之Draw Call Batching
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
在屏幕上渲染物體,引擎需要發(fā)出一個(gè)繪制調(diào)用來訪問圖形API(iOS系統(tǒng)中為OpenGL ES)。每個(gè)繪制調(diào)用需要進(jìn)行大量的工作來訪問圖形API,從而導(dǎo)致了CPU方面顯著的性能開銷。 Unity在運(yùn)行時(shí)可以將一些物體進(jìn)行合并,從而用一個(gè)繪制調(diào)用來渲染他們。這一操作,我們稱之為“批處理”。一般來說,Unity批處理的物體越多,你就會(huì)得到越好的渲染性能。 Unity中內(nèi)建的批處理機(jī)制所達(dá)到的效果要明顯強(qiáng)于使用幾何建模工具(或使用Standard Assets包中的CombineChildren腳本)的批處理效果。這是因?yàn)?#xff0c;Unity引擎的批處理操作是在物體的可視裁剪操作之后進(jìn)行的。Unity先對(duì)每個(gè)物體進(jìn)行裁剪,然后再進(jìn)行批處理,這樣可以使渲染的幾何總量在批處理前后保持不變。但是,使用幾何建模工具來拼合物體,會(huì)妨礙引擎對(duì)其進(jìn)行有效的裁剪操作,從而導(dǎo)致引擎需要渲染更多的幾何面片。 Materials 材質(zhì) 只有擁有相同材質(zhì)的物體才可以進(jìn)行批處理。因此,如果你想要得到良好的批處理效果,你需要在程序中盡可能地復(fù)用材質(zhì)和物體。 如果你的兩個(gè)材質(zhì)僅僅是紋理不同,那么你可以通過 紋理拼合 操作來將這兩張紋理拼合成一張大的紋理。一旦紋理拼合在一起,你就可以使用這個(gè)單一材質(zhì)來替代之前的兩個(gè)材質(zhì)了。 如果你需要通過腳本來訪問復(fù)用材質(zhì)屬性,那么值得注意的是改變Renderer.material將會(huì)造成一份材質(zhì)的拷貝。因此,你應(yīng)該使用Renderer.sharedMaterial來保證材質(zhì)的共享狀態(tài)。 Dynamic Batching 動(dòng)態(tài)批處理 如果動(dòng)態(tài)物體共用著相同的材質(zhì),那么Unity會(huì)自動(dòng)對(duì)這些物體進(jìn)行批處理。 動(dòng)態(tài)批處理操作是自動(dòng)完成的,并不需要你進(jìn)行額外的操作。 Tips: 提醒: 1、 ?? ? ?? ?? ?? ? 批處理動(dòng)態(tài)物體需要在每個(gè)頂點(diǎn)上進(jìn)行一定的開銷,所以動(dòng)態(tài)批處理僅支持小于900頂點(diǎn)的網(wǎng)格物體。 2、 ?? ? ?? ?? ?? ?如果你的著色器使用頂點(diǎn)位置,法線和UV值三種屬性,那么你只能批處理300頂點(diǎn)以下的物體;如果你的著色器需要使用頂點(diǎn)位置,法線,UV0,UV1和切向量,那你只 ? ?? ?? ?? ?能批處理180頂點(diǎn)以下的物體。 ? ?? ?? ?? ?請(qǐng)注意:屬性數(shù)量的限制可能會(huì)在將來進(jìn)行改變。 4、 ? ? ? ?? ?? ?? ?不要使用縮放尺度(scale)。分別擁有縮放尺度(1,1,1)和(2,2,2)的兩個(gè)物體將不會(huì)進(jìn)行批處理。 5、 ?? ? ?? ?? ?? ?統(tǒng)一縮放尺度的物體不會(huì)與非統(tǒng)一縮放尺度的物體進(jìn)行批處理。 ? ? ? ? ?? ? ?? ?? ???使用縮放尺度(1,1,1)和 (1,2,1)的兩個(gè)物體將不會(huì)進(jìn)行批處理,但是使用縮放尺度(1,2,1)和(1,3,1)的兩個(gè)物體將可以進(jìn)行批處理。 6、 ? ? ?? ?? ???使用不同材質(zhì)的實(shí)例化物體(instance)將會(huì)導(dǎo)致批處理失敗。 7、 ? ? ? ?? ?? ???擁有l(wèi)ightmap的物體含有額外(隱藏)的材質(zhì)屬性,比如:lightmap的偏移和縮放系數(shù)等。所以,擁有l(wèi)ightmap的物體將不會(huì)進(jìn)行批處理(除非他們指向lightmap的同一 ? ?? ?? ???部分)。 8、? ? ?? ?? ???多通道的shader會(huì)妨礙批處理操作。比如,幾乎unity中所有的著色器在前向渲染中都支持多個(gè)光源,并為它們有效地開辟多個(gè)通道。 9、 ? ? ?? ?? ???預(yù)設(shè)體的實(shí)例會(huì)自動(dòng)地使用相同的網(wǎng)格模型和材質(zhì)。 靜態(tài)批處理 相對(duì)而言,靜態(tài)批處理操作允許引擎對(duì)任意大小的幾何物體進(jìn)行批處理操作來降低繪制調(diào)用(只要這些物體不移動(dòng),并且擁有相同的材質(zhì))。因此,靜態(tài)批處理比動(dòng)態(tài)批處理更加有效,你應(yīng)該盡量低使用它,因?yàn)樗枰俚腃PU開銷。 為了更好地使用靜態(tài)批處理,你需要明確指出哪些物體是靜止的,并且在游戲中永遠(yuǎn)不會(huì)移動(dòng)、旋轉(zhuǎn)和縮放。想完成這一步,你只需要在檢測(cè)器(Inspector)中將Static復(fù)選框打勾即可,如下圖所示: ? 使用靜態(tài)批處理操作需要額外的內(nèi)存開銷來儲(chǔ)存合并后的幾何數(shù)據(jù)。在靜態(tài)批處理之前,如果一些物體共用了同樣的幾何數(shù)據(jù),那么引擎會(huì)在編輯以及運(yùn)行狀態(tài)對(duì)每個(gè)物體創(chuàng)建一個(gè)幾何數(shù)據(jù)的備份。這并不總是一個(gè)好的想法,因?yàn)橛袝r(shí)候,你將不得不犧牲一點(diǎn)渲染性能來防止一些物體的靜態(tài)批處理,從而保持較少的內(nèi)存開銷。比如,將濃密森里中樹設(shè)為Static,會(huì)導(dǎo)致嚴(yán)重的內(nèi)存開銷。 靜態(tài)批處理目前只支持Unity iOS Advanced。 |
轉(zhuǎn)載于:https://www.cnblogs.com/lifesteven/p/3664750.html
總結(jié)
以上是生活随笔為你收集整理的Unity3D性能优化之Draw Call Batching的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ug怎么画曲线_UG怎么画雨伞?ug曲面
- 下一篇: 解决(?)问题