2014-10-10 1 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

+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

Смежные вопросы