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 @   mc宇少  阅读(338)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示