2010-06-08 3 views
0

Я создаю систему частиц для своей игры, которая в основном представляет собой дым, выходящий из ракет в моей игре. Все частицы находятся в ccArray, называемом дымом.cocos2d ccArray remove object is slow

ccArray *smoke = ccArrayNew(0); 

У меня есть класс под названием Smoke, который является подклассом CCSprite, с добавлением Ивар под названием __opacity.

Когда я добавляю новый дым в ccArray я так:

ccArrayAppendObject(smoke, [Smoke spriteWithFile: @"smoke.png"]); 
[smoke->arr[smoke->num - 1] setupWithTouch: touch andOpacity: 255.0f]; 
[self addChild: smoke->arr[smoke->num - 1]]; 

Который не отстает на всех, и очень быстро,

И это, как я обрабатывать дым каждый рама:

if(smoke->num > 0) 
{ 
    for(NSUInteger i = 0; i < smoke->num; i++) 
    { 
     Smoke *s = smoke->arr[i]; 

     s.__opacity = s.__opacity - 255.0f * delta; 

     [s setOpacity: s.__opacity]; 

     if(s.__opacity <= 0.0f) 
     { 
      [self removeChild: s cleanup: YES]; 
      ccArrayFastRemoveObjectAtIndex(smoke, i); 
     } 
    } 
} 

Когда непрозрачности меньше 0, то удалить дым от сцены, а затем

удалите его из массива - это часть, которая замедляет игру, удаляя ее из массива. Он идет от 60 FPS до 15-20 FPS, когда на сцене есть 60 дымовых частиц.

Любые идеи, как я могу ускорить это?

Кроме того, причина, по которой я использую ccArray вместо NSMutableArray, заключается в том, что я читаю ccArray быстрее.

+0

Смотри также: http://www.learn-cocos2d.com/2010/09/array-performance-comparison-carray-ccarray-nsarray-nsmutablearray/ – LearnCocos2D

ответ

1

Удаление объекта из середины или начала массива (любого массива) воссоздает массив, а операция выполняется очень медленно (alloc + copy of members), если у вас есть datastruct со многими удалениями, которые не находятся в конце вы, вероятно, следует использовать связанный список

здесь некоторые реализации я нашел в интернете (не проверял, но она выглядит прилично) http://www.cocoadev.com/index.pl?DoublyLinkedList

+1

Или 'NSSet', если вам не нужен упорядоченный доступ. –

+0

NSSet - очень хорошее решение, если вам не нужно заказывать, поскольку Apple не обеспечила реализацию связанного списка –