CCSpriteBatchNode停止添加大约15k的子项

时间:2013-04-17 22:10:11

标签: ios cocos2d-iphone ccspritebatchnode

我正在使用CCSpriteBatchNode基本上一次绘制一条线(使用1x1样本)。我需要这样做是因为用户正在实时控制线路的位置(它不是绘图应用程序,但我认为我所做的是可比较的)。

事实证明,当我将15-16k个孩子添加到batchNode时,它会停止注册新孩子。基本上看起来笔用完了墨水!

我在cocos2d代码中略微探讨了一下,但似乎没有任何问题出现。它只是停止注册新的子节点。有人知道为什么吗?

1 个答案:

答案 0 :(得分:1)

首先,让我以一种非常轻描淡写的方式说出来:

<强>哎哟!

接下来,技术原因。一旦你批量生成了16.384个精灵,你的精灵就无法渲染。由于每个sprite使用四边形(4个顶点)在屏幕上渲染精灵,因此每个批处理操作都会达到顶点限制65.536个顶点。

每批操作(VBO buffer limit)不会绘制更多顶点。这是技术限制。你可以尝试使用另一个CCSpriteBatchNode来获得额外的精灵 - 但是你真的要走这条路了。

如果您只需绘制线条,这可能是我能想象到的最糟糕的方法。考虑使用线条绘制(ccDrawLine),单个像素(ccDrawPixel我相信也存在,但15k像素会非常慢)或着色器来实现相同或类似的效果。您甚至可以使用CCDrawNode使用cocos2d 2.1批量绘制图元。

我在YETIPIPI中成功使用的另一个解决方案是使用有限数量的精灵,例如20到200,并将它们绘制到CCRenderTexture。每次添加新的精灵时,都会重新使用最近最少使用的精灵。通过不清除rendertexture,您可以继续使用更少的精灵绘制它,而之前绘制的所有内容仍然存在。通过绘制低不透明度的精灵,您甚至可以获得在相同位置绘制更长时间的效果,以使该区域更加不透明。