Unity Shader学习笔记(一)DrawCall
发表于2017-12-28
在Unity中,每次引擎准备数据并通知GPU的过程称为一次Draw Call,这一过程是逐个物体进行的,对于每个物体,不止GPU的渲染,引擎重新设置材质/Shader也是一项非常耗时的操作,下面就给大家介绍下Draw Call的使用。
DrawCall
DrawCall就是一个命令,从CPU发起,GPU接收。这个命令指向一个需要被渲染的图元(primitives)列表,告诉GPU开始进行一个渲染过程。相当与OpenGL中的glDrawElements命令,DirectX中的DrawIndexedPrimitive命令。
CPU和GPU并行工作
使用一个命令缓冲区(Command Buffer),CPU添加命令,GPU读命令。命令有多种,DrawCall是其中一种,其他命令还有改变渲染状态等。
渲染模型ABC就是DrawCall。改变渲染状态往往更耗时。
DrawCall数量影响帧率
因为每次调用DrawCall前,CPU都需要给GPU发送很多内容:数据、状态、命令等,需要做很多工作:检查渲染状态等。而GPU的渲染速度往往快于CPU提交命令的速度。如果DrawCall太多,CPU就会把大量时间花在提交DrawCall上,造成CPU过载,而GPU空闲。
减少DrawCall
批处理(Batching)
即把很多小的DrawCall合并成一个大的DrawCall。因为合并也是需要时间的,所以更适合静态的物体。对于动态物体进行批处理,则会每一帧都要重新合并再发送,对空间时间都会有影响。
批处理合并的网格需要使用同一种渲染状态。
开发中注意避免
避免使用大量很小的网格。如果有,考虑合并。
避免使用过多材质。
Unity Shader学习笔记系列教程: