2013-09-16 2 views
0

У меня есть группа объектов CCSprite, которые все добавлены в пакетный узел в CCLayer. Эти спрайты должны обновлять свои позиции в методе обновления CCLayer. FPS - 60, а при сцене - 60, а затем резко падает до тех пор, пока он не достигнет 2 или 1 FPS! моего метод обновления (который работает в 60 раз в секунду) выглядит следующим образомiOS Cocos2d - FPS падает при перемещении многих спрайтов

-(void)update:(ccTime)delta { 

    for (int i = 0; i<spritesArray.count; i++) { 

     ((CCSprite *)[spritesArray objectAtIndex:i]).position = ccp(..., ...); 

    } 
} 
+0

Почему вы удивлены, увидев, что fps идут вниз, используя это? – Arbitur

+0

Сколько спрайтов? Что произойдет, если вы вообще не запустите код обновления? PS: проигнорируйте начальный FPS, он принимает пару кадров для FPS, чтобы заселиться - это не означает, что слой нарисован на частоте 60 кадров в секунду, это означает, что счетчик FPS потребовался момент, чтобы отобразить фактический FPS. На самом деле это занимает больше времени медленнее, чем снимается сцена, и ниже 10 кадров в секунду все равно становится совершенно неточным (не так уж важно, поскольку любой игровой рисунок ниже 10 кадров в секунду не воспроизводится). – LearnCocos2D

+0

Не все спрайты создаются в одно и то же время. Когда начинается сцена, запускается таймер, и каждый 1,0 интервал времени создается новым спрайтом. Я попытался создать их все сразу, когда начинается сцена, но никаких изменений в производительности. Причина, по которой я обновляю позиции спрайтов в методе обновления слоя, а не только CCMove-ing их при создании, заключается в том, что их траектории движения являются синусоидальными/косинусовидными волнами с различными амплитудами и длинами волн. – mim

ответ

0

Просто, чтобы сделать вашу легче жить и итерация быстрее и код легче читать все в то же время, вот как использовать быстрое перечисление сделать точно такая же вещь:

-(void)update:(ccTime)delta 
{ 
    for (CCSprite* sprite in spritesArray) 
    { 
     sprite.position = ccp(..., ...); 
    } 
} 

Это быстрее, потому что она удаляет два сообщения посылает (количество и objectAtIndex) для каждой итерации, а также внутренние оптимизации за счет использования быстрого перечисления в первую очередь.

+0

Это улучшило его немного. Производительность по-прежнему очень вялая – mim

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