2014-10-10 68 views
0

有沒有更有效的方法來清理我的CCNodes?我正在調用這個函數(和其他人喜歡它的不同的遊戲對象),在一個計時器。有沒有更有效的方法來清理我的CCNodes?

- (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 2014-10-11 09:26:24

+0

所有這些將是「更好」。更快,更少的內存使用。 – quantumpotato 2014-10-13 23:12:48

+0

更好地解決一個已知的性能問題,可以衡量並歸因於這些特定的代碼行? – YvesLeBorg 2014-10-15 11:14:51

回答

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 2014-10-16 20:35:26

相關問題