Unity SRP Batcher的工作原理
根據(jù)我的理解總結(jié),SRP Batcher就是
1、把調(diào)用draw call前,一大堆CPU的設置工作給一口氣處理了,增加了效率。
2、把材質(zhì)的屬性數(shù)據(jù)直接永久放入到顯卡的CBUFFER里,那只要數(shù)據(jù)不變,CPU就可以
不需要把這些數(shù)據(jù)重新做設置工作。節(jié)省了CPU調(diào)用,增加了效率。
3、用專用的代碼將引擎的屬性(比如objects transform)直接放入到GPU顯存,這個專用的代碼是不是更快更強呢,
官方是這樣么說的,用的詞語是quickly,就是快。
4、SRP Batcher并沒有減少drawcalls,而僅僅是提高了效率。相當于一個人減肥了,減去了多余的脂肪和水分,但是器官結(jié)構(gòu)啥的一個沒少??傊褪怯杏谩?/p>
具體的解釋
SRP Batcher定義:
SRP Batcher是一個渲染循環(huán)(loop),可在有很多使用相同的shader Variant的材質(zhì) 的場景中,加速你的CPU渲染。
注意它的定義,也就是用的同一個shader,但是不同的材質(zhì),也能加速。
如果想使用SRP Batcher,必須符合以下任意一個管線:
1、URP管線(The Universal Render Pipeline)
2、HDRP管線(The High Definition Render Pipeline)
3、一個自定義的SRP(也就是自己寫的SRP,手打牛肉丸)。
SRP Batcher的工作原理
SRP Batcher誕生的原因:
在一個Drawcall被一個新的material使用的時候,有很多工作要做。
所以如果場景有越多的materials,就會有越多的CPU必須使用去設置GPU 數(shù)據(jù)。
傳統(tǒng)的方法是減少DrawCalls的數(shù)量去優(yōu)化CPU渲染性能。
因為Unity必須在調(diào)用drawcall前設置很多東西。
并且真正的CPU消耗來自那些設置工作,而不是GPU drawcall本身。
Drawcall只是一些Unity向GPU command buffer發(fā)送的bytes。
?
SRP Batcher 通過批處理(batching)一系列綁定(Bind)和繪制(Draw)GPU 命令,來減少DrawCalls之間的GPU 設置(工作量)。也就是之前一堆綁定和繪制的GPU命令,老子一口氣給它處理完。不需要一步步設置。

上面的圖是我翻譯的,可能有些不好理解,但是左右圖比較看看的話,右圖的工作量確實大大減少了,
畢竟從6個設置步驟減少成了2個。
為了讓你的渲染達到最大的性能,這些批處理必須盡可能大。
為了達到這樣的效果,你可以使用盡量多的同一個shader,但不同的材質(zhì),但是盡量少的shader變體。
?
SRP Batcher 是一個低級渲染循環(huán),它使得Material 數(shù)據(jù)長久在GPU內(nèi)存里。
如果Material內(nèi)容不變,SRP Batcher就不需要設置并上傳buffer到GPU里。
相反( 如果Material內(nèi)容有變),SRP Batcher 使用專用的代碼路徑去快速更新Unity Engine屬性到一個大型的GPU bufer里。如下:

上圖,CPU僅僅處理Unity Engine 屬性,
所有Materials 有長久的CBUFFERs在GPU 顯存里,并準備去使用了。
這會加速渲染,因為所有的Material 內(nèi)容現(xiàn)在長久在GPU顯存里。
專用的代碼管理大型的每個object GPU CBUFFER,給所有的objecct 屬性。
?
SRP Batcher 兼容性
用SRP Batcher去渲染一個物體的條件如下:
1、渲染的物體必須是一個mesh或者skinned mesh。不能是粒子。
2、Shader代碼必須兼容SRP Batcher。
3、該材質(zhì)不能在運行中被代碼修改MaterialPropertyBlock,否則也無法compatible SRP Batcher。(12月24號更新)
?
兼容SRP Batcher的Shader的條件如下:
1、必須聲明所有內(nèi)建引擎properties 在一個名為"UnityPerDraw"的CBUFFER里。
例如:URP內(nèi)置的UnityInput.hlsl里。也就是說,如果你的代碼有引用或間接引用UnityInput.hlsl,那就不用做這一步了。

2、必須聲明所有材質(zhì)properties在一個名為"UnityPerMaterial"的CBUFFER里。
這個我上一篇文章有具體的實現(xiàn)步驟,這個是傳送門:
https://blog.csdn.net/zakerhero/article/details/107690964
在C#代碼中,可以用以下代碼在游戲運行時打開SRP Batcher.
GraphicsSettings.useScriptableRenderPipelineBatching = true;
?
支持的手機平臺:
IOS Metal
OpenGL ES 3.1以上
Vulkan
?
以上,希望本文能給正在使用URP和HDRP的人提供一些幫助。
本文參考文章:
https://docs.unity3d.com/Manual/SRPBatcher.html
————————————————
版權(quán)聲明:本文為CSDN博主「黃瑯」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/zakerhero/article/details/107714801