我们在面试的过程中经常被问到的一个问题就是Draw call,那么Draw call是什么、到底有多重要、哪些因素会影响它、我们怎么去优化它?
1. Draw call是什么?
Draw call是CPU对底层图形绘制接口的调用命令GPU执行渲染操作,渲染流程采用流水线实现,CPU和GPU并行工作,它们之间通过命令缓冲区连接,CPU向其中发送渲染命令,GPU接收并执行对应的渲染命令。
2. 到底有多重要?
如果Draw Call的数量太多,CPU就会把大量时间花费在提交Draw Call 上,造成CPU的过载,会影响帧率。建议Draw call次数保持在50以下,总之越少越好。
3. 哪些因素会影响它?
要减少Draw call次数,就需要批处理,把小的Draw Call合并到一个大的Draw Call中。但是我们批处理的时候往往会被阻断,这里我们就要搞清楚哪些情况会被阻断:
- Label
- Mask
- 粒子
- And so on
4. 我们怎么去优化它?
这里我们举几个例子来看一下,用cocos creator 2.4.2做参考(不同引擎不同版本可能结果不一样)。
我们新建一个空场景,发现Draw call是1
空场景.jpg
-
Label + Sprite
一个Item.jpg
如上图我们添加了一个item(Label + Sprite)发现Draw call变成3了,这很好理解,图片一次,文字一次。但这个不是我们想要的,照这样发展下去,2个item有5次,3个item有7次。。。。那么100个就有201次,这很恐怖了,如下图:
超多drawcall.jpg
怎么优化呢?
我们可以让这文字也变成图片,和这张图片合在一起处理,这时候就可以用Bitmap font或者TextAtlas去代替文字,不管加多少个Item,Draw call次数都不会增加,如下图:
处理后.jpg -
Sprite + Mask + Sprite
我们在空场景中创建一个空节点,然后给这个节点上面添加一个Mask组建,发现Draw call次数变成3了,也就是说一个Mask有两次Draw call
一个Mask.jpg
但只是这样吗?显然不是,请看下面两张图:
正常顺序.jpg
调整顺序后.jpg
这两张图片其他什么都一样,只是Mask在节点树中的位置发生了变化,导致了Draw call次数增加。
这种情况还比较好处理,我们尽量不要让Mask在Sprite之间。
如下图,像Mask+Sprite这种每增加一个Item Draw call就会增加3,比Label + Sprite还恐怖,这种情况又该怎么处理呢?
网友评论