DrawCall,Batches,SetPass calls是什么?原理?【匠心之作】
目录
下面是默认渲染管线和URP上的SetPass calls值 实验。
这三个值大家应该比较眼熟,也就是Unity点击Stats弹出的窗口里的信息。
官网渲染 Statistics 窗口信息:https://docs.unity.cn/cn/current/Manual/RenderingStatistics.html
先来看看 CPU 到 GPU 通信原理图:
渲染流程如下:(内置渲染管线 / 在URP未开启SRP Batcher)
DrawCall是什么?
DrawCall就是一个渲染命令,理解成它来告诉GPU渲染哪个物体即可。这个命令指向一个需要被渲染的图元(点,线,面等)列表,不包含任何材质信息,这个命令本身并没有多少开销。
Batches( 批处理 )是什么?
其实就理解成DrawCall值就可以,一个Batch至少包含一个DrawCall,那么为什么不叫DrawCall呢?
- 原因 1:Unity引擎开启批处理情况下将把满足条件的多个对象的渲染组合到一个内存块中以便减少由于资源切换而导致的 CPU 开销,也就是把多个DrawCall合并成一个DrawCall,来减少调用DrawCall的开销(主要是调用DrawCall之前的一系列设置),这个操作就是批处理。
- 原因 2:把数据加载到显存,设置渲染状态及数据,CPU调用DrawCall的这一整个过程就是一个Batch。这个过程当中主要性能消耗点在于上传物体数据(加载到显存)和设置渲染状态及数据这一块,而不是DrawCall命令本身。
下图中的一整个流程为一个Batch
在下图中Batched值为3
SetPassCall是什么?
官网解释:渲染 pass 的数量。每个 pass 都需要 Unity 运行时绑定一个新的着色器。
SetPassCall可能不太好理解(反正个人没理解官网解释)
内置渲染管线:我请教过大佬,大佬的解释是可能会发生切换渲染状态次数,个人解释是切换材质球的次数。
URP:未开启SRP Batcher情况下等同于材质球数量,开启SRP Batcher情况下等同于渲染状态切换次数。(不明白渲染状态切换,那么返回到上面理解原理图)
下面是默认渲染管线和URP上的SetPass calls值 实验。
假如 场景当中(关闭其他因素的情况下,如阴影,天空盒等,为了更方便计算)摄像机照射范围内有9个物体,用的都是一个Shader的情况下,4个物体分别用不同材质球,剩下5个物体使用同一个材质球时,那么一共有5个材质球。
默认渲染管线:
不同颜色代表着不同的材质球
结论:SetPass calls值等同于材质球的数量
URP
未开启SRP Batcher情况下(不同颜色代表着不同的材质球)
开启SRP Batcher情况下(不同颜色代表着不同的材质球)
结论:未开启SRP Batcher情况下等同于材质球数量,开启SRP Batcher情况下等同于渲染状态切换次数。
额外内容
CPU和GPU通信原理参考来自UnityShader入门精要(书籍) 和 RenderDoc抓帧数据。
以下是用RenderDoc抓的每个物体DrawCall图
物体 1(绿色物体,Shader:Standard)
物体 2(黄色物体,Shader:Standard)
物体 3(浅红色物体,Shader:Unity/Color)
重点关注glUniform4fv和glUseProgram即可。
参考:
- UnityShader入门精要(书籍)
- Batch, Draw Call, Setpass Call:https://zhuanlan.zhihu.com/p/76562300