Cocos2d v3 - addChild方法会产生性能问题

时间:2014-12-07 19:07:37

标签: ios objective-c iphone cocos2d-iphone

我目前在cocos2d版本3.3中使用addChild方法存在性能问题。我的方案目前是我有大约10个CCNode,其中包含一捆其他CCNode(大约500个),我称之为十个"大节点"。

大节点的孩子"有自己的孩子(约3)。那些CCNode是精灵。

来自" Big Node"的孩子都没有。运行任何动作。更新方法中会发生更改(如果相关)。

在我的主要场景中,我发现了哪个" Big Node"在屏幕上。如果他们是一个新的"大节点"或者在屏幕上看不到旧的我运行此代码:

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-100ms之间。

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或这些&#34; Big Nodes&#34;哪些是屏幕外的?

提前谢谢

1 个答案:

答案 0 :(得分:1)

500个节点很多节点。您不希望在运行时添加/删除它们。

相反,只需更改父级的visiblepaused属性,而不需要它们来阻止它们呈现和运行预定的选择器和操作。