最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

Unity SRP Batcher的工作原理

2022-06-09 10:46 作者:少女的美夢7  | 我要投稿

根據(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


Unity SRP Batcher的工作原理的評論 (共 條)

分享到微博請遵守國家法律
茶陵县| 盖州市| 喀喇| 盐边县| 丁青县| 嘉禾县| 耒阳市| 花莲县| 德阳市| 浦江县| 定兴县| 瓮安县| 冷水江市| 洛阳市| 吕梁市| 泸西县| 齐河县| 通化县| 济阳县| 屏边| 临清市| 武安市| 衡东县| 兴业县| 阳原县| 宣恩县| 竹北市| 句容市| 台江县| 襄汾县| 乐亭县| 新余市| 江津市| 乌拉特前旗| 伊吾县| 德惠市| 上饶县| 资中县| 泽普县| 屏东县| 金川县|