关于Draw call

Draw call就是CPU调用图像编程接口(OpenGL中的glDrawElements命令),命令GPU进行渲染操作的过程。
命令缓冲区
如果CPU要等到GPU完成上一个渲染任务才能再发送渲染命令,显然会造成效率低下,因此为了让CPU和GPU可以同时工作命令缓冲区就此产生了。
命令缓冲区包含里一个命令队列,CPU向其中添加命令,而GPU从中读取命令,添加和读取过程是相互独立的,这使得CPU和GPU可以相互独立工作。
命令缓冲区除了Draw call以外还有其他命令(改变使用的着色器,使用不同的纹理等)。

关于Draw call_第1张图片
命令缓冲区。CPU通过图像编程接口向命令缓冲区中添加命令,而GPU从中读取命令 并执行。黄色方框内的命令就是Draw Call,而红色方框内的命令用于改变渲染状态。我们使 用红色方框来表示改变渲染状态的命令,是因为这些命令往往更加耗时

Draw call对帧率的影响
在每次调用draw call之前,CPU需要向GPU发送很多内容,其中包括数据、状态、命令等。在这一阶段,CPU需要完成很多工作,列如检查渲染状态等。而一旦CPU完成了这些准备工作,CPU就可以开始本次的渲染。GPU的渲染能力很强,渲染200个和2000个三角网格通常没有什么区别,因此渲染速度往往快于CPU提交命令的速度。如果Draw Call太多,CPU往往就会把大量的时间花费在提交Draw Call上,造成CPU的过载。

关于Draw call_第2张图片
命令缓冲区中的虚线方框表示GPU已经完成的命令。此时,命令缓冲区中没有可以执 行的命令了,GPU处于空闲状态,而CPU还没有准备好下一个渲染命令。

如何减少Draw Call
静态批处理——(Static复选框打勾)
如果使用大量很小的网格时,可以考虑是否合并它们。
避免使用过多的材质。尽量在不同的网格中使用共同的材质。

关于Draw call_第3张图片
利用批处理,CPU在RAM把多个网格合并成一个更大的网格,再发送给GPU,然后在 一个Draw Call中渲染它们。但要注意的是,使用批处理合并的网格将会使用同一种渲染状 态。也就是说,如果网格之间需要使用不同的渲染状态,那么就无法使用批处理技术

参考书籍《Unity Shader入门精要》

你可能感兴趣的:(关于Draw call)