unity学习之可编程渲染管线 SRP Batcher

基本概念

SRP Batcher 是一个渲染循环,可通过许多使用同一着色器变体的材质来加快场景中的 CPU 渲染速度。(可以理解为合批处理),如标题所讲要使用SRP Batcher项目必须使用可编程渲染管线。可以是URP(通用渲染管线)/HDRP(高清渲染管线)/SRP(自定义)。

本文主要讲述在URP中使用SRP Batcher,在创建好URP工程之后(如何新建URP工程不是本文重点这里不在赘述),需要在对应的UniversalRenderPipelineAsset的Inspector窗口,找到Advance勾选SRP Batcher,当然默认也是勾选的。也可以在代码中动态修改

GraphicsSettings.useScriptableRenderPipelineBatching = true;

SRP Batcher 的工作原理

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

SRP Batcher 通过批处理一系列 Bind 和 Draw GPU 命令来减少 DrawCall 之间的 GPU 设置。

Bind 和 Draw 命令的批处理可以减少绘制调用之间的 GPU 设置。 

URP Shader 兼容性

不是所有的对象都可以用 SRP Batcher 来渲染,对于渲染对象是有条件限制的。这个对象必须是 mesh 或者 Skinned Mesh,而不能是个 particle。Shader 也必须与 SRP Batcher 兼容,它封装了 URP 中的所有 lit 和 unlit Shader(除了这些 Shader 的粒子版本)。我们可以在 Inspector 中查看 Shader 的兼容性。

如何使 Shader 与 SRP 匹配 

我们来看下官方的手册

扫描二维码关注公众号,回复: 14615085 查看本文章

根据手册可知,要想匹配是有条件的

  1. 必须在一个名为“UnityPerDraw”的 CBUFFER 中声明所有内置引擎属性。例如:unity_ObjectToWorld 或 unity_SHAr
  2. 必须在一个名为 UnityPerMaterial 的 CBUFFER 中声明所有材质属性。

我们随便找一个工程中的shader文件打开,可以看到下面类似的代码:

 当然即使在使用不兼容的对象时,Unity 也会正确渲染场景。这是因为兼容对象使用 SRP Batcher 代码路径,而其他对象则使用标准 SRP 代码路径。

对 SRP Batcher 进行数据分析

1.创建一个shader文件(lit)

 引用了一张纹理贴图。保存以后选中当前shader文件以后右键create-->material分别新建两个引用当前shader的材质。

 2.在场景中分别创建一个cube 和sphere,分别置顶两张贴图。如下图:

为了测试 SRP Batcher ,我们把这两个对象复制多一点在场景中(模拟一下游戏中的背包)。接下来开始测试

3.Unity 帧调试器中的 SRP Batcher 数据

在 Editor 中,选择 Window > Analysis > Frame Debugger > Render Camera > Render Opaques__,然后展开 RenderLoopNewBatcher.Draw__ 列表。 2.单击要检查的 SRP Batch

 可以看到DrawCall只有1, 那我们尝试关闭SRP Batcher,再来看一波数据。

关闭以后直接飙升到62(场景中cube和sphere各有31个)。

这里需要注意一点:1不代表只使用了一个 DrawCall 来显示了这些内容,而是对它们进行了序列上的优化。DrawCall 的数量还是 62 没有变化,我们只是提高了他的效率。 换句话说,我们用一次通知CPU需要62次绘制。

 4.通过挂载 SRPBatcherProfiler.cs测量使用 SRP Batcher 时场景中的增速。

下载脚本需要访问GitHub,我这网速就不尝试了,有兴趣的自己去试试看。下面贴一下步骤:

  •  在你的 URP 场景中创建一个空的 GameObjec。
  • 将 SRP Batcher 模板中的 SRPBatcherProfiler.csC# 脚本添加给 GameObjec。运行这个脚本:会在场景中出现 SRP Batcher 叠加层,我们就可以找到有关 SRP Batcher 的一些详细信息。
  • SRP Batcher 叠加层中的时间量度以毫秒(ms)为单位,显示 CPU 在 Unity SRP 渲染循环中花费了多少时间。

完结 

猜你喜欢

转载自blog.csdn.net/liu_xueping/article/details/123348240