2014-12-07 5 views
0

현재 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 또는 오프 스크린 이들 '빅 노드 "를 가진이 시나리오를 처리하는 가장 좋은 솔루션입니다을 비활성화하는 방법이 있나요?

답변

1

500 노드는 노드 많은 입니다 사전에 감사합니다. 런타임에 추가/삭제하지 않으려합니다.

예약 된 선택자와 작업을 렌더링하고 실행하는 것을 방지 할 필요가 없을 때 부모의 visiblepaused 속성을 변경하십시오.

+0

귀하의 솔루션을 구현했습니다. 그 외에도 하나의 Big Node에 대해 노드 수를 50으로 줄입니다. 그러나 나는 업데이트, 방법 사이에 여전히 20-50ms의 시간차가 있습니다. 그 때문에 나는 여전히 불안한 움직임을 보이고있다. 나는 앱을 프로파일 링하고 업데이트 방법이 15 % CPU를 알고 있다고 계산하지만, 예를 들어 CCRender 플러시는 65 % CPU를 사용합니다. 나는 새로운 버전의 cocos2d (버전 3)가 오프 스크린 노드를 처리 할 수 ​​있다고 생각했다. 그 맞습니까? –

+0

오프 스크린 노드를 렌더링하지 않지만 노드 그래프 전체가 모든 프레임을 여전히 통과해야하기 때문에 수백 개의 노드가 여전히 상당한 오버 헤드를 추가합니다. 플러스 당신이 실행하는 코드. ;) – LearnCocos2D

+0

좋습니다. 너무 많은 노드를 처리하는 가장 좋은 방법은 무엇입니까? 그것은 수평 측면 스크롤 게임입니다. 당신은 좋은 지침서 또는 좋은 생각이 있습니까? 나는이 문제를 며칠 동안 알고 있었고 내 게임의 마지막 단계 중 어느 정도는 알았습니다. 니가 나를 돕고 싶다면 우리는 채팅 할 수있을거야. –