【发布时间】:2015-02-05 10:32:28
【问题描述】:
我目前在 cocos2d 3.3 版中的addChild 方法存在性能问题。我目前的情况是我有大约十个CCNode,其中包含一捆其他CCNode(大约500 个),我将这十个称为“大节点”。
“大节点”的孩子有自己的孩子(大约 3 个)。那些 CCNode 是精灵。
“大节点”中的所有子节点都不执行任何操作。一切都发生在他们的更新方法中(如果这相关的话)。
在我的主要场景中,我发现了屏幕上的“大节点”。如果它们是新的“大节点”或旧的在屏幕上不再可见,我运行此代码:
self = mainScene
_allBigNodes = holds all avaible big nodes
NSMutableArray * childsToRemove = [NSMutableArray arrayWithCapacity: _children.count];
for(CCNode * child in _children){
if([child isKindOfClass:[BigNode class]]){
[childsToRemove addObject:child];
}
}
for(CCNode * child in childsToRemove){
[child removeFromParentAndCleanup:NO];
}
[childsToRemove removeAllObjects];
for(int BigNodeIndex = _fromBigNodePosition; BigNodeIndex<=_toBigNodePosition; ++BigNodeIndex){
BigNode * BigNode = [_allBigNodes objectAtIndex: BigNodeIndex];
[self addChild: BigNode];
}
主屏幕通常最多有两个孩子。上面的方法效果很好。
关于这个问题:有时在我的游戏中我有一些紧张的动作。所以我用分析工具计算出上面的 addChild 方法的成本在 60-100 毫秒之间。
Running Time Self Symbol Name
90.0ms 79.6% 0.0 -[CCNode addChild:]
90.0ms 79.6% 0.0 -[CCNode addChild:z:name:]
89.0ms 78.7% 0.0 -[CCNode onEnter]
88.0ms 77.8% 0.0 -[NSArray makeObjectsPerformSelector:]
88.0ms 77.8% 0.0 -[CCNode onEnter]
72.0ms 63.7% 0.0 -[NSArray makeObjectsPerformSelector:]
71.0ms 62.8% 0.0 -[CCNode onEnter]
42.0ms 37.1% 0.0 -[NSArray makeObjectsPerformSelector:]
42.0ms 37.1% 0.0 -[CCNode onEnter]
39.0ms 34.5% 0.0 -[CCScheduler scheduleTarget:]
38.0ms 33.6% 2.0 PrioritySearch
1.0ms 0.8% 1.0 DYLD-STUB$$objc::DenseMap<objc_object*, unsigned long, true, objc::DenseMapInfo<objc_object*> >::grow(unsigned int)
1.0ms 0.8% 0.0 -[CCNode physicsNode]
1.0ms 0.8% 0.0 -[CCNode physicsNode]
1.0ms 0.8% 1.0 objc_msgSend
1.0ms 0.8% 1.0 objc_object::sidetable_release(bool)
28.0ms 24.7% 0.0 -[CCScheduler scheduleTarget:]
26.0ms 23.0% 1.0 PrioritySearch
1.0ms 0.8% 0.0 -[CCScheduler scheduledTargetForTarget:insert:]
1.0ms 0.8% 1.0 DYLD-STUB$$objc_msgSend
1.0ms 0.8% 0.0 -[CCNode physicsNode]
1.0ms 0.8% 1.0 DYLD-STUB$$objc_msgSend
16.0ms 14.1% 0.0 -[CCScheduler scheduleTarget:]
14.0ms 12.3% 0.0 PrioritySearch
2.0ms 1.7% 0.0 -[CCScheduler scheduledTargetForTarget:insert:]
1.0ms 0.8% 0.0 -[CCScheduler scheduleTarget:]
1.0ms 0.8% 1.0 -[CCNode wasRunning:]
所以我的问题是:有没有办法停用 ccnode,或者什么是处理这种有许多 ccnode 或这些“大节点”不在屏幕上的场景的最佳解决方案?
提前谢谢你
【问题讨论】:
标签: ios objective-c iphone cocos2d-iphone