[已解决]关于drawCall的问题,请官方大神回复

我在使用UI编辑器导出json文件来作为游戏UI的资源,发现发布成小图(散图)和大图(图集),两者在游戏中的drawCall是一样的,理论上使用图集应该减少drawCall才对,希望官方人生或者大神给于解答,谢谢

大神呢,期待回复

drawcall这块我也不太熟悉。我帮你问下其它人哈。

:7: 使用图集无法减少drawcall, 材质从哪来的和glDrawElements次数没关系啊

哥们,其他引擎(unity,starling等)使用图集都能有效减少drawCall,不然一个稍微复杂的UI,drawCall能达到几百,这还了得。

使用图集减少draw call是有一定前提条件的,图集并不是减少draw call的直接条件。
真正减少draw call是需要多个连续绘制的节点使用同样的贴图时,可以一次性批量绘制

举个栗子

当你有A, B, C三种节点,其中A, B使用同一张贴图(在同一个图集中),C使用另一张贴图
假设绘制顺序是:
A
C
B

这种情况下是无论任何引擎都无法减少draw call的,因为A绘制完需要替换贴图,然后绘制B之后再替换贴图,最后绘制C。
draw call:3

假设绘制顺序是:
A
B
C

那么是可以做到将A, B同时绘制,最后绘制C
draw call:2

如果你需要达到这样的效果,需要将所有使用同一个图集的Sprite对象用SpriteBatchNode来管理起来,这样SpriteBatchNode就可以一次性绘制自身所有的子结点(WebGL模式下)。
在Cocos2d-x 3.x中,已经做到了自动批处理,所以省去了用户的一些操作,但是当你想要最大化这种效应的时候,还是建议使用SpriteBatchNode从逻辑上自己控制

以上讨论都是基于WebGL,Canvas模式不具备批处理的能力,所以draw call数量无论是否使用SpriteBatchNode都无法减少,必然是一个对象一个对象的绘制,但是SpriteBatchNode依然可以在一定程度上提高性能。

此外,Layer的bake方法也可以有效得减少draw call:http://www.cocos2d-x.org/docs/manual/framework/html5/v3/bake-layer/zh

2赞

这个回答我相当满意,赞,多谢多谢