一 什么是DrawCall
Draw Call 理解和优化:
http://blog.csdn.net/sakyaer/article/details/44459881
draw call是openGL的描绘次数
一个简单的openGL的绘图次序是:设置颜色→绘图方式→顶点座标→绘制→结束。
每帧都会重复以上的步骤。这就是一次draw call如果有两个model,那么需要
设置颜色→绘图方式→顶点座标A→绘制→结束。
设置颜色→绘图方式→顶点座标B→绘制→结束。
两次draw calls;
也就是说在openGl绘制前,如果色彩通道(color filter),绘图方式(shader),顶点座标(model)不同的情况下draw calls就会增加。对openGl来说绘制参数(状态值)的变更要比绘制大量的顶点更耗费cpu。
二 Egret中减少DrawCall
1 使用6张单张图片和1个Label,drawcall数是6图片+1文本=7。
2 现在将6张图片合并成一张,drawcall数是1图片+1文本=2
3 现在只将两个按钮合并
drawcall数如下图,是10次。
如果图"朋友圈"和"微信"是同一张图drawcall算1次,那么应该是9次才对,为什么是10次?
因为当A和B是一张图,C是单张图。
如果渲染顺序是 A->B->C 则drawcall是2
但是渲染顺序A->C->B则drawcall是3
三 Egret中减少drawcall的合图做法
1 将同一场景或模块的图片合成一张,则可以大幅度减少drawcall数
2 合图可以使用texturemerger,手动合并。
也可以使用wing发布时的合并图选项,但是wing发布合图时根据资源组合并,所以你必须事先将同一场景或模块分好了资源组。 (测试wingIDE的合图有问题,不建议使用)
四 EUI中的排列顺序对DrawCall的影响
现在有ABCD四张图
当在EUI中由上到下是ABCD时,drawcall是2
当顺序是ACBD时,DrawCall是4
总结:EUI的渲染次序是从上到下的,将同一图片放在相邻的顺序上,可以减少drawcall数。
五、cacheAsBitmap缓存为位图对drawcall的影响
drawcall由4变成了2