SRP Batcher,Draw Call优化,Shader SRP Batcher compatible

当我们使用SRP(Scriptable Render Pipeline)之后,例如HDRP,URP或者LWRP,在SPR的asset文件中有一个选项叫做SRP Batcher(如图)。

这篇文章就让我们来了解了解这个好东西。

 

作用

简单的说,如果当你的场景中有很多的物体分别使用到了不同的Material,但是这些Material使用的Shader却都是同一个时,SRP Batcher可以大大为我们降低DrawCall,从而加快渲染速度。

官方介绍:https://blogs.unity3d.com/2019/02/28/srp-batcher-speed-up-your-rendering/

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

中文文档:https://connect.unity.com/p/srp-batcher-jia-su-xuan-ran

接下来我们可以通过一个简单的示例来验证这个效果。

 

示例

首先我们先通过Create->Shader->Unlit Shader创建一个简单的无光照Shader命名为SampleUnlit。接着我们创建三个Material,分别命名为SampleMaterial1,SampleMaterial2,SampleMaterial3。这三个Material都使用我们刚刚创建好的SampleShader,并分别引用不同的Texture。

接着我们在场景中创建15个Cube,分别引用上面的这些Material,效果如图

   

此时打开Game视图的Statistics面板,可以看见15个Cube一共产生了15个DrawCall(由于SkyBox会产生一个DrawCall所以显示的有16个),而Saved By Batching

<think> 我们在处理UnitySRP Batcher兼容性问题。用户遇到了在Frame Debugger中提示"SRP: node is not compatible with SRP batcher"的问题,需要解决方案。 首先,我们需要理解SRP Batcher的工作原理:它要求材质使用相同的着色器变体,并且材质属性必须在常量缓冲区中声明(即使用CBUFFER_START和CBUFFER_END包裹)。 不兼容的原因通常包括: 1. 材质使用了不同的着色器变体(例如,不同的关键字导致不同的变体)。 2. 材质的属性没有在常量缓冲区中声明(即没有在CBUFFER中声明)。 3. 着色器代码不符合SRP Batcher的要求。 解决方法步骤通常包括: 1. 检查材质使用的着色器是否兼容SRP Batcher(在着色器的Inspector面板中会显示兼容状态)。 2. 确保材质属性在着色器代码中正确地声明在CBUFFER中。 3. 避免使用材质属性块(MaterialPropertyBlock),因为它会破坏SRP Batcher的合批。 4. 确保所有需要合批的材质使用相同的着色器变体(即相同的关键字组合)。 具体步骤: 1.Unity编辑器中,选中出现问题的材质,查看Inspector面板,看是否有“SRP Batcher compatible”的标记。如果不兼容,会显示不兼容的原因。 2. 检查着色器代码,确保所有材质属性(除了纹理)都声明在CBUFFER_START(UnityPerMaterial)和CBUFFER_END之间。 3. 如果使用了MaterialPropertyBlock,考虑是否必须使用,如果必须使用,则无法使用SRP Batcher合批该物体。 4. 确保不同的材质实例使用相同的关键字(即着色器变体相同)。可以使用Shader.WarmupAllShaders来预加载所有变体,但更关键的是避免在运行时动态改变关键字导致变体不一致。 另外,可以打开SRP Batcher的调试模式来查看更详细的信息: 在Unity的菜单中选择“Window -> Analysis -> Frame Debugger”,然后在Frame Debugger窗口中启用,并查看渲染事件。选择提示不兼容的事件,查看具体原因。 如果着色器是自己编写的,可以参考Unity官方文档中关于SRP Batcher兼容性的要求修改着色器。 注意:有时,即使材质属性在CBUFFER中声明,如果声明的位置不正确(例如在顶点着色器或片元着色器内部),也会导致不兼容。正确的做法是在着色器的全局作用域中声明。 下面是一个兼容SRP Batcher的着色器属性声明示例: ```hlsl CBUFFER_START(UnityPerMaterial) float4 _BaseColor; float4 _BaseMap_ST; // 注意:纹理的缩放偏移也可以放在这里,但纹理本身不需要(纹理通过单独的方式设置) float _Metallic; float _Smoothness; CBUFFER_END ``` 但是,纹理(sampler2D)不能放在CBUFFER中,它们有单独的设置方式。SRP Batcher要求纹理通过传统的SetTexture方式设置,但UnityPerMaterial中只存放浮点类型的属性。 此外,如果着色器中使用了多个CBUFFER(例如,除了UnityPerMaterial还有其他的),也可能导致问题。通常,所有材质属性都应该放在名为UnityPerMaterial的CBUFFER中。 如果问题仍然存在,可以尝试使用Unity提供的工具来检查:在Frame Debugger中选中该绘制事件,查看具体的不兼容原因(如显示“Material has different shader keywords”等)。 总结步骤: 1. 检查材质在Inspector中的SRP Batcher兼容状态。 2. 修改着色器,确保所有非纹理材质属性都在UnityPerMaterial的CBUFFER中声明。 3. 确保材质没有使用MaterialPropertyBlock。 4. 确保材质之间使用相同的着色器关键字(变体一致)。 如果以上步骤都正确,应该能够解决该问题。 </think> ### 解决 Frame Debugger 中提示 "SRP: node is not compatible with SRP batcher" 的方法 该错误表明渲染节点无法与 UnitySRP Batcher 兼容,通常由着色器或材质配置问题引起。以下是系统性的解决方案: #### 1. **检查材质兼容性** - 在 Project 窗口选中问题材质,查看 Inspector 面板顶部的兼容性提示: - ✅ 绿色标记:兼容 - ❌ 红色警告:不兼容 - **修复步骤**: 1. 双击材质使用的着色器,打开着色器代码 2. 确保所有材质属性声明在 `CBUFFER_START(UnityPerMaterial)` 和 `CBUFFER_END` 块内 ```hlsl // 正确示例 CBUFFER_START(UnityPerMaterial) float4 _BaseColor; float _Metallic; CBUFFER_END ``` #### 2. **验证着色器变体** - **问题**:材质启用了 SRP Batcher 不支持的着色器关键字 - **解决方法**: 1. 在材质 Inspector 中检查启用的关键字(如 `_ALPHATEST_ON`) 2. 在着色器中添加兼容声明: ```hlsl #pragma multi_compile _ _ALPHATEST_ON // 显式声明变体 ``` #### 3. **排查 MaterialPropertyBlock 使用** - **问题**:脚本中通过 `MaterialPropertyBlock` 动态修改属性会破坏批处理 - **修复方案**: ```csharp // 避免以下操作: MaterialPropertyBlock props = new MaterialPropertyBlock(); props.SetColor("_Color", Color.red); renderer.SetPropertyBlock(props); // 导致不兼容 ``` #### 4. **检查渲染器组件** - 禁用可能引起冲突的组件: - ❌ `DisableBatching` 组件(设为 False) - ❌ 动态合批(在 Project Settings > Graphics 中关闭) - ❌ GPU Instancing(如果与 SRP Batcher 冲突) #### 5. **调试工具使用** - 开启 SRP Batcher 调试模式: 1. 菜单栏:`Window > Analysis > Frame Debugger` 2. 启用调试后,选中报错的 DrawCall 事件 3. 查看 **"Why not batched?"** 字段获取具体原因 ![](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAwIiBoZWlnaHQ9IjMwMCI+PC9zdmc+) [^1] #### 6. **更新 Unity 和渲染管线** - 确保使用兼容版本: - Unity 2020.3+ 或 Unity 2021 LTS - URP 10.5.1+ / HDRP 10.4.0+ - 更新路径:`Window > Package Manager > 选择渲染管线 > Update` > ⚠️ **特殊情况处理**: > 当使用自定义 Shader Graph 时,需在 Graph 设置中启用 `SRP Batcher` 选项(默认为兼容状态)。 ### 验证修复效果 1. 修改后重新进入 Play Mode 2. 打开 Frame Debugger 观察警告是否消失 3. 在 Profiler 中查看 `SRPBatcher` 统计项,确认批处理效率提升 --- ### 相关问题 1. UnitySRP Batcher 与传统动态批处理有何本质区别? 2. GPU Instancing 和 SRP Batcher 能否同时生效?如何优化共存配置? 3. 如何通过 Shader Graph 创建完全兼容 SRP Batcher 的自定义着色器? [^1]: Unity 官方文档:https://docs.unity3d.com/Manual/SRPBatcher.html
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值