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

 

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

 

其他:

1. EUI的多个Group不增加drawcall。

 

 

2. EUI的自定义组件,如果组件内图片是同一张,多个组件不增加drawcall。

以下组件GruideHand,组件内使用的图片是一张图,则多个自定义组件在EUI内drawcall是1.

 

 

posted on 2017-12-12 17:01  gamedaybyday  阅读(3254)  评论(0编辑  收藏  举报