SRP Batch

SRP Batch是SRP提供的批处理方法。

SRP Batch不会减少DrawCall的数量,而是使其更精简。它在GPU上缓存了材质属性,因此不必再每次绘制调用时都将其发送出去。这样既减少了需要传达的数据量,又减少了每个绘图调用CPU需要完成的工作。

但这仅在着色器遵守用于uniform数据的严格结构时才有效:

所有材质属性(Properties块)都需要在具体的存储缓冲区内定义,而不是在全局级别上定义。这是通过将_BaseColor声明包装在带有UnityPerMaterial名称的cbuffer块(有些设备不支持)中来完成的。这就像一个结构声明,需要以分号终止。它通过将_BaseColor放入特定的常量内存缓冲区中来隔离它,尽管它仍可在全局级别访问。

 效果:

 

 FrameDebugger:

 补充知识:

1.贴图属性是无法进入CBuffer处理的,它不用写到CBUFFER_START,但这不影响SRP正常加速,因为SRP不需要同材质,除非shader变体不一样,GPU Instancing同理也是不能写入UNITY_INSTANCING_BUFFER_START的!SRPBatch就和往常一样进行设置材质贴图即可,GPU Instancing因要求同材质,所以使用图集Atlas才能保证贴图一致进行合批,如果你不使用图集,那么一张贴图就是相当于生成一个新的材质实例,会打断合批!

2.使用Animation动画组件使用动画去控制材质属性会打断SRPBatch,因为Animation是使用MPB形式修改材质属性的

3.SRPBatch不支持SpriteRenderer,只能用MeshRenderer或SkinnedMeshRenderer

4.GPU Instancing不支持SkinnedMeshRenderer,支持MeshRenderer,SpriteRenderer能支持但不好做,因网格不一致会打断合批,SpriteRenderer是动态生成的网格根据贴图来生成的,除非贴图大小一致。

5.GPU Instancing设置材质属性时,instanced属性用MPB设置非instanced属性使用sharedMaterial.SetXxx设置,据我所知非instanced属性是材质纹理,最常见的就是_MainTex主纹理,你只能使用sharedMaterial.SetTexture进行设置

posted @ 2024-01-03 15:40  mc宇少  阅读(262)  评论(0编辑  收藏  举报