日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Unity3D性能优化之Draw Call Batching

發(fā)布時(shí)間:2023/12/10 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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。




性能優(yōu)化

轉(zhuǎn)載于:https://www.cnblogs.com/lifesteven/p/3664750.html

總結(jié)

以上是生活随笔為你收集整理的Unity3D性能优化之Draw Call Batching的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。