2014-10-10 2 views
0

내 CCNode를 정리하는보다 효율적인 방법이 있습니까? 나는이 함수를 다른 게임 객체에 대해 (타이머 객체로) 호출한다.내 CCNode를 정리하는보다 효율적인 방법이 있습니까?

- (void)pulseBullets:(NSMutableArray *)bs targets:(NSArray *)targets { 
    for (Bullet *b in bs) { 
     for (QuantumPilot *p in targets) { 
      if (p.active) { 
       [p processBullet:b]; 
       if (!p.active) { 
        [self processKill:p]; 
       } 
      } 
     } 
    } 

    NSMutableArray *bulletsToErase = [NSMutableArray array]; 
    for (Bullet *b in bs) { 
     [b pulse]; 
     if ([self bulletOutOfBounds:b]) { 
      [bulletsToErase addObject:b]; 
     } 
    } 

    for (Bullet *b in bulletsToErase) { 
     [b removeFromParentAndCleanup:YES]; 
    } 

    [bs removeObjectsInArray:bulletsToErase]; 
} 
+2

"효율적인"의미는 정확히 무엇입니까? 적은 코드? 적은 메모리 사용량? 빠른 코드? 쉽게 유지 보수 할 수 있습니까? 이 코드의 어느 부분을 비효율적이라고 생각하십니까? – LearnCocos2D

+0

모두 "더 좋을 것"입니다. 보다 빠르고 적은 메모리 사용. – quantumpotato

+0

'이러한 특정 코드 행을 측정하고 측정 할 수있는 알려진 성능 문제를 해결하는 것'이 더 낫습니다. – YvesLeBorg

답변

0

좋아요,하지만 성능에는 '진술'이 없으므로 직접 측정해야합니다. 반복 가능한 배열을 역순으로 반복하는 경우, 반복자가 삭제에 의해 무효화되지 않으므로 반복 중에 객체를 삭제하는 것이 안전합니다. 그래서 당신과 같이 배열을 삭제 총알을 제거 altogther를 얻을 수 :

for (Bullet *b in [bs reverseObjectEnumerator]) { // *** do not change iteration order *** 
    for (QuantumPilot *p in targets) { 
     if (p.active) { 
      [p processBullet:b]; 
      if (!p.active) { 
       [self processKill:p]; 
      } 
     } 
    } 

    [b pulse]; 
    if ([self bulletOutOfBounds:b]) { 
     [b removeFromParentAndCleanup:YES]; 
     [bs removeObject:b]; 
    } 
} 

이 간단하지만 반복하는 동안 배열의 내용을 변경의 고유 한 위험을 모호하게한다. 당신은 그것이 '청소기'인지 여부에 관해서 전화를합니다. 또한, 반복자를 뒤집는 '비용'이 당신이 저장 한 것보다 높습니다. 내가 말했듯이 그것을 측정해야 할 것입니다.

+0

나는 그것을 좋아한다. 감사 – quantumpotato