找回密码
 立即注册
查看: 339|回复: 0

Unity 开发中 SRP Batches API调用的实际情况

[复制链接]
发表于 2022-6-29 11:38 | 显示全部楼层 |阅读模式
目的: 使用RenderDoc查看SRP Batches和在Unity FrameDebugger中没有的信息以便正确认识SRP Batches。
修改了Universal Render Pipeline/Lit为LitMoreProperty,加入了一个变量(包含在CBUFFER中的_MoreProperty)为了测试在2个Material设置不同值。

  • 使用这个Shader创建了2个Material,然后设置其中一个Albedo纹理(如图所示),另一个不做设置。
2.  _MoreProperty设置成不同值
3.  使用了很多不同的模型。



测试用例



Material1,设置Albedo,调整MoreProperty



Material2,不设置

那么Unity Frame Debugger会是什么情况呢?



注意只有一个SRP Batch

Unity FrameDebugger的信息相对较少, 接下来看看RenderDoc有什么样的信息可以获取



第一次DrawCall

其实它一个DrawCall都没少,但是从FragmentShader那里可以看到它使用到了2个缓冲区数据UnityPerDrawUnityPerMaterial



第二个DrawCall

第二个DrawCall看到有切换模型和调整缓冲区(UnityPerDraw)范围



第3个DrawCall

调用的API出奇的少只有调整缓冲区和绘制



第4个DrawCall

和第二个DrawCall很相近,设置模型和调整缓冲区范围,另外设置了一次纹理, 还有一次Buffer871(就是因为_MoreProperty值的不同所以设置了一次新的数据缓冲区)。
从RenderDoc的信心可以看到,SRP Batches确实没有减少DrawCall, 但是在后续DrawCall中也省下了很多命令调用, 并且在不同的Material之间也可以省下很多命令的调用
<hr/>接下来当我调整勾选项Specular Highlights使2个Material不同时,SRP Batches变成了2个



2次SRP Batch, 注意Keywords位置

那么可以确定SRP Batch在Keywords不同的情况下是不能合批的。
不能合批的情况下通过RenderDoc可以看到什么呢?



第一次SRP Batches情况下的第一个DrawCall



第一次SRP Batches情况下的某个DrawCall



第二次SRP Batch的第一个DrawCall

第二次SRP Batch的第一个DrawCall那么就是一个完全新的DrawCall了和第一次SRP Batch一样。



第二次SRP Batch的某个DrawCall

结论:

  • 同一个Shader基础下的不同Material修改纹理,模型,参数也还是可以合批的,但是这些设置不同会在接下来的DrawCall中调整设置。
  • Keywords不同就不能SRP Batch。
3. 想让SRP Batch发挥更好的效果, 那么需要尽可能让那些 相同的纹理,模型,参数的物件依次渲染, 以此避开API的调用。
4. SRP Batch很强大,但不能单独依靠它,也需要其他优化。
知包:Unity 开发中 Dynamic Batches 在Opengl和Vulkan中API调用的实际情况
知包:Unity 开发中 GPUInstancing在Opengl和Vulkan中API调用的实际情况

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-15 21:01 , Processed in 0.120355 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表