Unity3D中DrawCall、Batches、SetPassCall

DrawCall,一帧当中CPU调用GPU渲染指令接口的次数。

本文测试用的是Unity3D - 2020.3.8版本

在Unity3D编辑器中,通过Window->Analysis->Profiler打开Profiler页面,然后选中Rendering栏,如下所示
在这里插入图片描述
在这里就可以看到drawcall的数量了,在stats界面是看不到DrawCall数目的,对于DrawCall的定义如下:
**DrawCall:**CPU每次调用图像编程接口 glDrawElements(OpenGl中的图元渲染函数)或者 DrawIndexedPrimitive(DirectX中的顶点绘制方法)命令GPU渲染的操作称为一次Draw Call,调用会传入图元模式、顶点数目、索引值类型以及指向索引数组的指针。

Batches, 一帧当中CPU给GPU传输顶点数据以及渲染状态的次数。

查看Batches,在编辑器中查看方式,首先切换到Game界面,然后点States选项,如下所示:
在这里插入图片描述

Batch,就是批次的意思,当CPU和GPU通信的时候,会把需要传递的数据传给GPU,例如渲染状态,用什么Shader、用那些材质等,一个Batch至少会包含一次DrawCall(一般是一次,特殊情况:当这个批次的定点数目过多,就得分成两次或者多次去调用DrawCall),我们在Unity中测试的时候,通常会发现Batches和DrawCall是一样的。通常我们说合批能能够提高游戏的性能,一般可以这么说,但是Batches高并不是游戏帧率低的直接原因,而是batch太多导致切换渲染状态太频繁,切换渲染状态是比较耗时的,比如在Shader常见的是否关闭深度写入,开启模板测试等。

SetPassCall, 和shader的Pass有关,unity的解释是Shader中的Pass被切换的次数。

数值查看在unity编辑器里面的位置如下所示:
在这里插入图片描述
简单来说,就是一帧中,要切换shader中pass的次数,比如一个Shader中有两个pass,那么这个Shader一次就增加两次SetPassCall,如果前后两次drawcall中,shader没变,那么SetPassCall的值是不会增加的,应该可以这么去间的的验证下,在Unity编辑器中,打开FrameDebug,如下:
在这里插入图片描述
通过切换第一个红框中的不同帧,可以看到不同的shader的切换,最后总次数应该是等于我们看到的SetPassCall值。

猜你喜欢

转载自blog.csdn.net/qq_41841073/article/details/125229753