2013-04-17 60 views
0

我正在使用CCSpriteBatchNode一次绘制基本上一个像素的线(使用1x1色板)。我需要这样做,因为用户正在控制线路的实时位置(这不是绘图应用程序,但我认为我所做的是可比的)。CCSpriteBatchNode停止添加约15k的儿童

事实证明,当我将15-16k的孩子添加到batchNode中时,它会停止注册新的孩子。基本上,它似乎就像笔用完了!

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

回答

1

首先,让我的方式,确实是一个巨大的轻描淡写这样说:

哎哟!

接下来是技术原因。你的精灵只要你有16.384的批次就会失败。由于每个精灵都使用一个四边形(4个顶点)在屏幕上渲染精灵,因此每个批处理操作的顶点数限制为65.536个顶点。

每个批次操作都不会绘制更多顶点(VBO buffer limit)。这是一个技术限制。你可以尝试使用另一个CCSpriteBatchNode来获得更多的精灵 - 但是,严肃地说,你会在这里通往无处可去的道路。

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

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

+0

谢谢,这非常好知道!有趣的是,这种技术到目前为止一直非常卓越 - 直到你达到极限。我喜欢将精灵绘制到CCRenderTexture的想法,以便它们可以重用。我想知道如果我在不同的绘图时间改变像素大小,是否会有问题... –