合并图片、EUI顺序、CacheAsBitmap对drawcall影响的测试

一 什么是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。

合并图片、EUI顺序、CacheAsBitmap对drawcall影响的测试

合并图片、EUI顺序、CacheAsBitmap对drawcall影响的测试

2 现在将6张图片合并成一张,drawcall数是1图片+1文本=2

合并图片、EUI顺序、CacheAsBitmap对drawcall影响的测试

合并图片、EUI顺序、CacheAsBitmap对drawcall影响的测试

3 现在只将两个按钮合并

合并图片、EUI顺序、CacheAsBitmap对drawcall影响的测试

合并图片、EUI顺序、CacheAsBitmap对drawcall影响的测试

drawcall数如下图,是10次。

合并图片、EUI顺序、CacheAsBitmap对drawcall影响的测试

如果图"朋友圈"和"微信"是同一张图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顺序、CacheAsBitmap对drawcall影响的测试

当在EUI中由上到下是ABCD时,drawcall是2

合并图片、EUI顺序、CacheAsBitmap对drawcall影响的测试

合并图片、EUI顺序、CacheAsBitmap对drawcall影响的测试

当顺序是ACBD时,DrawCall是4

合并图片、EUI顺序、CacheAsBitmap对drawcall影响的测试

合并图片、EUI顺序、CacheAsBitmap对drawcall影响的测试

总结:EUI的渲染次序是从上到下的,将同一图片放在相邻的顺序上,可以减少drawcall数。

五、cacheAsBitmap缓存为位图对drawcall的影响

合并图片、EUI顺序、CacheAsBitmap对drawcall影响的测试

drawcall由4变成了2

合并图片、EUI顺序、CacheAsBitmap对drawcall影响的测试

总结:将静态图片放在一个group内,并使用cacheAsBitmap,可以减少drawcall

上一篇:OnContextMenu事件(转)


下一篇:java线程基本知识