2014-12-07 32 views
0

我目前在cocos2d 3.3版中的addChild方法存在性能問題。我目前的情況是,我有大約10 CCNode,其中包含其他CCNode(約500),我稱這十個「大節點」。Cocos2d v3 - addChild方法使性能問題

「大節點」的孩子們有自己的孩子(約3人)。那些CCNode是精靈。

「Big Node」中的任何孩子都不會執行任何操作。 Everthing發生在他們的更新方法中(如果這是相關的)。

在我的主場景中,我想出了哪個「大節點」在屏幕上。如果他們是一個新的「大節點」或舊的已不再顯示在屏幕上運行此代碼:

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]; 

     } 

主屏有normaly最多兩個孩子的。上述方法工作正常。

關於這個問題:有時在我的遊戲中,我有一些不安的動作。所以我想出了使用分析工具的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或什麼是處理有許多ccnodes或這些「大節點」這是屏幕之外的這種情況最好的解決辦法?

預先感謝您

回答

1

500個節點是很多節點的。您不希望在運行時添加/刪除它們。

相反,只需更改父母的visiblepaused屬性,而不需要它們來阻止它們呈現並運行預定的選擇器和操作。

+0

我已經實施您的解決方案。除此之外,我還將一個Big Node的節點數減少到50個。但是在更新和方法之間,我仍然會有20-50毫秒的時間差異。因爲我還有一些不安的動作。我對應用進行了剖析,發現更新方法需要知道15%的CPU,但是例如CCRender刷新需要65%的CPU。我認爲新版本的cocos2d(版本3)可以處理離屏節點。那是對的嗎? – 2014-12-10 20:57:59

+0

它不渲染離屏節點,但數百個節點仍然增加開銷,因爲整個節點圖仍然必須遍歷每一幀。再加上你運行的任何代碼。 ;) – LearnCocos2D 2014-12-11 13:12:36

+0

好吧,這是有道理的。那麼處理這麼多節點的最好方法是什麼?這是一個水平的側面滾動遊戲。你有一個好的教程或一個好主意嗎?我在這個問題上堅持了幾天,這或多或少是我遊戲中最後一步。也許我們可以聊天,如果你想幫助我。 – 2014-12-11 19:47:07