Shader笔记--DrawCall

DrawCall我们经常会在各个地方提到。大佬给你说拼UI啊,要注意drawcall啊。发现游戏帧率不高,是不是drawcall过高啊....
其实drawcall就是一个命令,是cpu调用图形渲染的一个命令,也就是CPU与GPU通信的一个接口。
CPU收集筛选数据,在调用DrawCall把渲染命令添加到命令缓冲区中,然后GPU从这个缓冲区中读取渲染命令。

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

我们的游戏的性能变差真正的原因是CPU在添加命令造成的,也就是多次调用drawcall的原因。我们在添加命令时需要收集创建各种元数据、分配内存等。这就使得性能降低了。同时改变渲染状态也是很慢的一个过程,所以我们要减少调用drawcall。

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

我们可以使用批处理来减少drawcall的调用,批处理分为静态批处理和动态批处理,静态就是把游戏中不移动的物体统一合并调用一次即可,动态批处理就是把需要同时变化的一个一些物体合并在一起,然后调用。这里就可以间接的理解为什么我们要把一个界面中使用UI图片打到一个图集或者定义到一个图集,并且尽量在同一个界面上不使用多个图集中的图片。还有就是我们避免使用过多的材质,尽量在不同的网格之前共用同一个材质。

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

这里说到的网格,如果我们使用网格来判断碰撞的话,性能就会降低,也就是间接的解释了为啥少用网格碰撞器的原因吧。

你可能感兴趣的:(Shader笔记--DrawCall)