SRP Batcher(一)

1,概念
SRP Batcher【Scriptable Render Pipeline Batcher】是一种drawcall上的优化,可显著提升使用SRP的应用的性能。针对那些使用相同shader变种的材质,它节省了unity需要为这些材质准备和分发drawCall所用的CPU时间。

2,要求与兼容性
    1,渲染管线的兼容:支持的管线:URP,HDRP,SRP, 不支持的:BRP
    2,物体的兼容性:
        在任何给定的场景中,有些物体兼容SRPBatcher,有些不能。兼容的物体使用SRP Batcher的渲染路径,而那些非兼容的物体使用的是标准的SRP渲染路径。
        物体要兼容SRPBatcher渲染路径,必须要符合如下条件:
        (1),物体必须要包含mesh或者skinned mesh,不能是粒子
        (2),物体不能使用MaterialPropertyBlocks
        (3),物体使用的Shader必须和SRPBatcher兼容
        
    3,Shader的兼容性
        HDRP和URP中所有lit和unit Shader都符合条件如下(除了粒子版本的Shader)
        针对一个要兼容SRPBatcher自定义的Shader,必须要符合如下条件:
        (1),Shader必须要将所有的内置引擎的属性统一定义在单一的名为UnityPerDraw的常量缓冲区中。比如,unity_ObjectToWorld, or unity_SHAr
        (2),Shader必须要将所有的材质属性命名在单一的名为UnityPerMaterial的常量缓冲区内。
        
    你可以在Shader的Inspector Panel中检查其兼容性。如下图:
    
    
    
3,使用SRPBatcher
    此章节中将阐述如何在Unity预制的SRP中使用SRPBather
    1,在URP中使用SRPBatcher
      在URP中激活SRPBather
      (1),在Project Setting面板中,选择URP Asset:
      
      (2),在选中的URPAsset的Inspector面板中,启用SRPBatcher.
      
      
      如果没有上述选型,则按照如下介绍的方法做:
      如何在URPAsset中显示附加属性
      unity在URP Asset中默认不显示某些高级属性,要查看所有的可用属性,可执行如下操作;
      在URP Asset中,任何一个部分,点击垂直省略号图标,选择“Show Additional Propertiese"
        
        unity会显示当前部分所有可用的属性
      要显示所有部分的所有附加属性,按照如下方法去做:
        (1),在unity的Preferences窗口,选择Core Render Pipeline选项。
        (2), 查看路径 Additional Properties-》Visibility,选择All Visbile
        
        
    2,在HDRP中使用SRPBatcher
        当你使用HDRP时,unity默认开启了SRPBatcher。不推荐禁用SRPBatcher。然而,你可能为了调试等目的而临时想禁用SRPBatcher。
        下面介绍如何在Editor构建时启用和禁用SRPBatcher.
        (1),在project Setting面板中,选择HDRP Asset
        (2),选择Debug Mode.如下图:
        
        (3),按需要选择enable或者disable.
        
        在运行时也可以启用和禁用SRP Batcher
        

<think>好的,用户想了解在Unity中开启SRP Batcher的最佳设置代码。首先,我需要回忆SRP Batcher的基本知识。SRP Batcher主要是通过减少Draw Call的CPU开销来提升渲染性能,特别是在使用自定义着色器时。根据引用[4],SRP Batcher需要个特定的“UnityPerDraw” CBUFFER来包含Unity内置的引擎变量,这可能涉及到着色器的编写规范。 接下来,用户需要代码示例。Unity中开启SRP Batcher通常是在渲染管线资产中设置的,所以可能需要通过C#代码来配置。例如,在HDRP或URP中,可以通过修改渲染管线的参数来启用SRP Batcher。此外,还要考虑材质和着色器的兼容性,如引用[3]提到的支持材质属性覆盖,这可能影响SRP Batcher的效果。 用户的问题可能还涉及到性能优化,比如引用[1]中提到的SRP Batcher不兼容导致的标准代码路径延迟,这时候可能需要检查材质是否使用了不兼容的属性块,或者粒子系统是否影响了批处理。此外,引用[4]提到的CBUFFER结构是否正确,也是需要检查的点。 需要确保提供的代码示例正确启用了SRP Batcher,并且处理了常见的兼容性问题。比如,在URP中,可以通过修改UniversalRenderPipelineAsset的设置,或者动态启用。同时,可能需要提供着色器的代码结构示例,确保符合SRP Batcher的要求。 最后,生成相关问题时要覆盖用户可能感兴趣的优化方法、兼容性检查以及性能分析等方面,帮助用户全面了解SRP Batcher的应用和调试。</think>在Unity中启用SRP Batcher需要从渲染管线设置和着色器代码两方面进行配置,以下是详细步骤和代码示例: ### 、基础设置方法 1. **在渲染管线资产中启用**(适用于HDRP/URP) ```csharp // 获取当前渲染管线资产 var renderPipelineAsset = GraphicsSettings.currentRenderPipeline; // 通用渲染管线(URP)设置 if (renderPipelineAsset is UniversalRenderPipelineAsset urpAsset) { urpAsset.useSRPBatcher = true; } // 高清渲染管线(HDRP)设置 if (renderPipelineAsset is HDRenderPipelineAsset hdrpAsset) { hdrpAsset.useSRPBatcher = true; } ``` 2. **运行时动态启用**(适用于所有SRP) ```csharp GraphicsSettings.useScriptableRenderPipelineBatching = true; ``` ### 二、着色器代码规范 必须按照SRP Batcher要求声明CBUFFER(参考[^4]): ```hlsl CBUFFER_START(UnityPerDraw) float4x4 unity_ObjectToWorld; float4x4 unity_WorldToObject; real4 unity_WorldTransformParams; // 其他必要内置变量... CBUFFER_END ``` ### 三、兼容性检查代码 ```csharp // 检查材质兼容性 bool IsMaterialCompatible(Material material) { return material.enableInstancing == false && material.GetTag("SRPBatcherCompatible", false) == "True"; } // 检查渲染器兼容性 void ValidateRenderer(Renderer renderer) { if (renderer.lightProbeUsage != LightProbeUsage.Off) { Debug.LogWarning($"Renderer {renderer.name} 使用光照探针会禁用SRP Batcher"); } } ``` ### 四、最佳实践 1. 避免使用MaterialPropertyBlock,改用材质变体(参考[^1]) 2. 确保所有自定义着色器包含完整的UnityPerDraw CBUFFER 3. 对于蒙皮网格渲染,使用GPU Skinning方案 4. 粒子系统需要启用Enable GPU Instancing
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小李也疯狂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值