「UnityShader笔记」01.CPU、GPU与DrawCall
CPU、GPU与DrawCall
命令缓冲区
所谓命令缓冲区,是指CPU和GPU之间的一块缓冲区,其中包含了一个命令队列,CPU向其中添加命令,GPU从中读取命令
缓冲区的存在,使得CPU和GPU可以并行地、互相独立地工作
命令缓冲区中存放了许多种命令,包括:DrawCall,修改渲染状态,修改着色器等
DrawCall
DrawCall是CPU向GPU发送的渲染操作指令,每调用一次DrawCall,GPU就会开始根据渲染状态以及输入的顶点数据进行计算,即进行一次完整的流水线
每次调用DrawCall,CPU都要完成一些工作,比如渲染状态的检查,这需要消耗时间,而GPU的渲染速度是很快的,如果CPU频繁发出DrawCall指令(此时的DrawCall往往都很“小”),GPU可能迅速完成渲染工作,而CPU则忙于进行DrawCall指令的相关预处理,导致CPU忙而GPU空闲等待,造成资源浪费,由此看来,DrawCall不宜太过频繁,应尽可能地减少DrawCall的次数,避免整体渲染速度被CPU拖累
批处理方式减少DrawCall次数
一个典型的方法就是批处理思想,既然多次的“小”DrawCall会造成CPU忙,那就将多个“小”DrawCall合并成一个大的DrawCall一次处理完毕,减少DrawCall次数
批处理方式会涉及网格的合并,这种合并也会消耗时间,对于动态物体,我们可能要反复多次进行合并,而对于静态物体,我们合并一次即可,因此批处理方式更适合静态物体