win7 chrome cocos2d-x-html5 -v3.1
我在一个循环里面随机生成sprite添加到场景中 使用的纹理是同一张纹理集里面的 为何绘制次数不是预期的 使用SpriteBatchNode就能达到预期 但是3.0以后,官方不是不推荐用SpriteBatchNode了么
到底要说什么
确实是这样 官方说的可能是在 JSB 或者 webgl 的情况下 可以不用SpriteBatchNode ;而在canvas下 还是SpriteBatchNode性能好!
我来给出下比较正式的答案和工作原理解释。目前Cocos2d-JS和batch相关的其实是有三个:autoBatch,SpriteBatchNode和layer.bake()
-
autoBatch,自动批量渲染。这个是在Cocos2d-JSB里,由C++的底层渲染器实现的,当几个顺序渲染的对象在同一个纹理上,渲染器就会自动batch,做批量渲染,提升渲染效率。
有效范围:Cocos2d-JSB(Cocos2d-JS的WebGL模式也可以支持该种模式,但是现在还没有实现,未来也会提供autoBatch功能)。 -
SpriteBatchNode,手动批量渲染。将同一个纹理的对象加入到SpriteBatchNode里,在渲染时,就可以批量渲染出来。和autoBatch的区别:1)手动,非自动 2) batch的范围理论上更大,autoBatch在能自动组合批量渲染的对象序列,不能插入其他不同纹理的对象。当出现其他来自不同纹理的对象的时候,batch动作就完成,无法将后续的对象继续加入。所以理论上某些情况下SpriteBatchNode的能力会更强,因为它可以穿越(实际是在逻辑层完成,对应一个render command)。
有效范围:Cocos2d-JSB和Cocos2d-JS WebGL Mode -
layer bake功能。
有效范围:Cocos2d-JS Canvas Mode。用来将不同的对象,缓存在另外一个canvas里,不受纹理限制。会将自身以及其子节点都备份(烘焙/bake)到一张画布(Canvas)上,只要自身或子节点不作修改,下次绘制时,将直接把画布上的内容绘制上去。这样,原来需要调用N次绘图的层,就只需要调用一次绘图了。 发生改变是,自动重新创建新的bake layer。
有效范围:Cocos2d-JS Cavas Mode。
现在的手机浏览器有些支持webgl有些支持Canvas, 难道我们在做项目的时候要根据不同的渲染引擎分别使用SpriteBatchNode和bake 优化方案,这么做代码太乱了。 就像现在的引擎一样: if(XXX)…else …