cocos2d ccArray удаление объекта происходит медленно - PullRequest
0 голосов
/ 08 июня 2010

Я создаю систему частиц для своей игры, которая в основном состоит из дыма от ракет в моей игре.Все частицы находятся в ccArray, называемом smoke.

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 быстрее.

1 Ответ

1 голос
/ 08 июня 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...