我目前在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或這些「大節點」這是屏幕之外的這種情況最好的解決辦法?
預先感謝您
我已經實施您的解決方案。除此之外,我還將一個Big Node的節點數減少到50個。但是在更新和方法之間,我仍然會有20-50毫秒的時間差異。因爲我還有一些不安的動作。我對應用進行了剖析,發現更新方法需要知道15%的CPU,但是例如CCRender刷新需要65%的CPU。我認爲新版本的cocos2d(版本3)可以處理離屏節點。那是對的嗎? – 2014-12-10 20:57:59
它不渲染離屏節點,但數百個節點仍然增加開銷,因爲整個節點圖仍然必須遍歷每一幀。再加上你運行的任何代碼。 ;) – LearnCocos2D 2014-12-11 13:12:36
好吧,這是有道理的。那麼處理這麼多節點的最好方法是什麼?這是一個水平的側面滾動遊戲。你有一個好的教程或一個好主意嗎?我在這個問題上堅持了幾天,這或多或少是我遊戲中最後一步。也許我們可以聊天,如果你想幫助我。 – 2014-12-11 19:47:07