Unity 之 SRP Batcher

什么是SRP

SRP是Unity的可编程渲染管线(Scriptable Render Pipeline), 是一项可以通过 C# 脚本来控制渲染的功能。它属于一种轻量的 API,允许开发者使用 C# 脚本来设置渲染命令,Unity 将这些命令传递给它的底层图形架构然后发送到 graphics API 当中,最终由 GPU 进行处理。Unity 的 URP 和 HDRP 都是基于 SRP 来的。

什么是SRP Batcher

套用 Unity 官方的话,SRP Batcher 是一个渲染循环,可通过许多使用同一着色器变体的材质来加快场景中的 CPU 渲染速度。简单讲就是 SRP Batcher 可以把相同shader的材质进行合批,以达到减少提交 SetPass 的次数。而当设置中开启 SRP Batcher 之后,默认的URP已经可以执行 SRP Batcher 优化了。

要使用 SRP Batcher,项目必须使用可编程渲染管线。URP 和 HDRP 下 SRP Batcher 是默认开启的。

作用

Unity 中,可以在一帧内的任何时间修改任何材质的属性。但是这种做法有一些缺点。例如,DrawCall 使用新材质时,需要执行许多作业(SetPass)。因此,当场景中的材质越多时,Unity 用于设置 GPU 数据的 CPU 性能消耗也越多。解决此问题的传统方法是减少 DrawCall 的数量以优化 CPU 性能成本,因为 Unity 在发出 DrawCall 之前必须进行很多设置。实际的 CPU 成本便来自该设置,而不是来自 GPU DrawCall 本身(DrawCall 只是 Unity 需要推送到 GPU 命令缓冲区的少量字节)。

SRP Batcher 可以把同一种 shader 对应的材质球的材质、颜色放到一个缓冲区中,不用每帧设置给GPU,每帧仅仅设置坐标、缩放、转换矩阵等变量给GPU,从而起到减少 SetPass,优化 CPU 性能的作用。

要注意 SRP Batcher 并不会减少 DrawCall。

工作原理

在过去的渲染架构中,Unity采取对一个材质分配一个CBUFFER。这个CBUFFER包括shader里显性的参数(自己定义的uniform参数)和隐性的参数(Unity固定的uniform modelMatrix、modelViewMatrix等),每一次的DrawCall都要更新这个CBUFFER。

对于SRP Batcher,在内部渲染循环中,当 Unity 检测到新材质时,CPU 会收集所有属性并在 GPU 内存中设置不同的常量缓冲区(CBUFFER)。GPU 缓冲区的数量取决于着色器如何声明其 CBUFFER。

SRP Batcher 是一个低级渲染循环,使材质数据持久保留在 GPU 内存中。如果材质内容不变,SRP Batcher 不需要设置缓冲区并将缓冲区上传到 GPU。实际上,SRP Batcher 会使用专用的代码路径来快速更新大型 GPU 缓冲区中的 Unity 引擎属性。

在SRP的渲染架构中,Unity采取了一个策略:对于每个材质,shader的显性参数分配到了一个CBUFFER里,而shader的隐性参数则是N个物体共享一个CBUFFER。比如一个shader对应了10个物体,在SRP渲染架构中,一共分配了11个CBUFFER,其中10个分别来存10个材质中的显性参数,然后分配一个大的共享CBUFFER,把这10个物体的隐性参数都放在一起。

这个策略为动静分离。材质的显性参数大部分是低频更新的,隐性部分是高频更新的。一次更新可以更新一片。

大型的共享CBUFFER和每个材质自己的CBUFFER都有各自专门的代码进行更新,大部分情况下只需要更新大型共享CBUFFER,从而降低了一帧内的SetPassCall数目。

对比GPU Instancing

和GPU Instancing相比,优于ConstantBuffer里不包含位置等信息(GPU Instance是包含的),仅包括了显性属性,所以一次DrawCall无法渲染所有物体,所以SRP Batcher的DrawCall次数是没有降低的。而GPU Instacing需要相同的Mesh和材质球,虽然条件更为苛刻,但是可以降低DrawCall。

参考

https://docs.unity3d.com/cn/current/Manual/SRPBatcher.html

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇