0

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

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

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

4

1 回答 1

1

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

哎哟!

其次,技术原因。一旦批处理了 16.384 个精灵,您的精灵将无法渲染。由于每个精灵使用四边形(4 个顶点)在屏幕上渲染精灵,因此您达到了每个批处理操作 65.536 个顶点的顶点限制。

每个批处理操作不会绘制更多顶点(VBO 缓冲区限制)。这是一个技术限制。您可以尝试使用另一个 CCSpriteBatchNode 来获取其他精灵 - 但严重的是,您正在走上一条无路可走的道路。

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

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

于 2013-04-17T22:22:43.123 回答