【发布时间】:2012-11-12 08:02:18
【问题描述】:
我有一个CCSpriteBatchNode,其配置如下:
CCSpriteBatchNode
ChildA1
ChildB1
ChildB2
....
ChildB999
ChildA2
ChildA3
...
所有孩子(ChildA1、ChildB1、ChildA2...)都是CCSprite 对象。 CCSpriteBatchNode 和除 ChildA1 之外的所有子代是通过以下方式创建的:
[CCSprite spriteWithSpriteFrameName:@"FileName.png"];
ChildA1 是这样创建的:
// Create Parent Sprite
CCSprite* childA1 = [[CCSprite alloc] init];
childA1.contentSize = CGSizeMake(37.5,37.5);
childA1.anchorPoint = ccp(0,0);
[batchNode addChild:childA1 z:0 tag:1];
// Add Child Sprites
[childA1 addChild:childB1 z:0 tag:1];
[childA1 addChild:childB2 z:0 tag:1];
[childA1 addChild:childB3 z:0 tag:1];
// Continue adding childB4-childB999
注意:这渲染得很好,我看到了我期望的输出,其中childB1 的位置相对于childA1,移动childA1 导致childB1 移动。
我的问题是:我会在childB1-childB999 的每个绘图中看到性能提升吗?据我了解,CCSpriteBatchNode 通过将其所有子 CCSprites 一起绘制来优化 CCSpriteBatchNode 中所有子的绘制。这是否也适用于CCSprites 的孩子?
对于那些想知道我为什么这样做的人:
这个游戏中有很多层,将CCSprites 分组到CCSprite 中的CCSpriteBatchNode 中允许我通过仅操作该组精灵的父组来操作一组CCSprites。
【问题讨论】:
-
AFAIK,是的。如果您使用 cocos2.0 或更高版本,请检查绘制图形的数量,添加一些子元素,它不应该增加:即批处理节点消耗每个添加的纹理(而不是“添加的每个精灵”)的单个绘制调用。不知道您是否在 ARC'ing,但如果不是,您可能会泄漏 childA1 所写的内容(该构造函数不会返回自动释放的对象)。
-
我同意 YvesLeBrog 的观点。如果您谈论 Cocos2d 的纹理内存,它会按图像或纹理加载。一旦纹理加载到内存中,再次加载它既不需要内存也不需要时间,从而提高了游戏的性能。关于变量消耗的内存,我认为这不是理想的方式,因为 CCSprite 实例在其类本身中是自动释放的。所以我们不必担心它们的内存消耗。
标签: iphone objective-c ios cocos2d-iphone