현재 cocos2d 버전 3.3의 addChild
메서드에 성능 문제가 있습니다. 내 시나리오는 현재 다른 CCNode
번 (약 500 개) 번들을 보유하고있는 약 열 개의 CCNode
을 가지고 있는데, 그 열 개의 "빅 노드"라고합니다.Cocos2d v3 - addChild 메서드가 성능 문제를 일으킬 수 있습니다.
"빅 노드"의 하위 노드에는 자체 하위 노드가 있습니다 (약 3 개). 이러한 CCNode는 스프라이트입니다.
"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];
}
메인 화면이 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-50ms의 시간차가 있습니다. 그 때문에 나는 여전히 불안한 움직임을 보이고있다. 나는 앱을 프로파일 링하고 업데이트 방법이 15 % CPU를 알고 있다고 계산하지만, 예를 들어 CCRender 플러시는 65 % CPU를 사용합니다. 나는 새로운 버전의 cocos2d (버전 3)가 오프 스크린 노드를 처리 할 수 있다고 생각했다. 그 맞습니까? –
오프 스크린 노드를 렌더링하지 않지만 노드 그래프 전체가 모든 프레임을 여전히 통과해야하기 때문에 수백 개의 노드가 여전히 상당한 오버 헤드를 추가합니다. 플러스 당신이 실행하는 코드. ;) – LearnCocos2D
좋습니다. 너무 많은 노드를 처리하는 가장 좋은 방법은 무엇입니까? 그것은 수평 측면 스크롤 게임입니다. 당신은 좋은 지침서 또는 좋은 생각이 있습니까? 나는이 문제를 며칠 동안 알고 있었고 내 게임의 마지막 단계 중 어느 정도는 알았습니다. 니가 나를 돕고 싶다면 우리는 채팅 할 수있을거야. –