Unity Shader学习笔记(一)DrawCall

发表于2017-12-28
评论1 5.9k浏览
在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学习笔记系列教程:

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引