Как сохранить постоянную скорость fps в cocos2d - PullRequest
1 голос
/ 28 ноября 2010

У меня 3 вопроса.

  1. Как сохранить постоянную (почти) частоту кадров в секунду в cocos2d. Когда много CCSprite создается и удаляется в течение небольшого интервала, например (5-8) в секунду, возможно ли поддерживать частоту кадров почти постоянной ??

  2. Достаточно ли [self removeChild:sprite cleanup:YES] или я должен также использовать

    CCTexture2D * texture = [текстура спрайта]; [[CCTextureCache sharedTextureCache] removeTexture: texture];

  3. Следующая часть кода отвечает за удаление моего кадра. Как лучше выполнить ту же задачу -

    id fadeout = [CCFadeOut actionWithDuration: 1.4f];

id call = [CCCallFunc actionWithTarget: самостоятельно селектор: @selector (RemoveSmashedSprite:)];

CCSequence* sequence= [CCSequence actions:fadeout, call, nil];
[smash runAction:sequence];

и

-(void)RemoveSmashedSprite:(id)sender
{


    CCSprite *sp = (CCSprite *)sender;



    [self removeChild:sp cleanup:YES];  

}

Это вызывается 5-8 раз в секунду. Поэтому частота кадров снижается. Может ли кто-нибудь мне помочь.

1 Ответ

4 голосов
/ 28 декабря 2010

Я предполагаю, что рассматриваемый "разбитый спрайт", вероятно, является одним из множества спрайтов, видимых на экране, более чем вероятно, имеющих одинаковую текстуру (возможно, часть листа спрайта, или все то же изображение и т. Д.? ).

Если это так, я бы порекомендовал выделить на экране количество спрайтов, которое требуется вашим играм, и вместо того, чтобы «уничтожать» (удалять их, заново создавать их), вам следует «повторно использовать их».

Сохраните ссылку на все CCSprite в NSMutableArray, заполните этот массив количеством спрайтов, которые вы считаете подходящими (сколько спрайтов удаляется в секунду? Сколько спрайтов добавляется в секунду? Сколько спрайтов на экране для начала? - используйте ответы на эти вопросы, чтобы определить наиболее подходящий размер вашего массива).

Затем, вместо удаления спрайта как дочернего, просто [sprite setVisible: NO], чтобы скрыть его, затем ... когда вам нужно отобразить новый на экране, используйте следующий «доступный» (скрытый) спрайт в массиве (отслеживайте последний «использованный» спрайт с индексом и просто увеличивайте его на 1, чтобы найти следующий «доступный». Как только индекс превысит границы, сбросьте его на 0 - в этот момент этот спрайт должен были "разбиты"). Как только у вас появится следующий «доступный» спрайт, измените его свойства (положение, масштаб, текстуру? Видимость) и примените все соответствующие действия (не забывайте «останавливать все действия» над ним, когда «разбиваете его») - это это то, что делает "cleanup: YES").

Если ваша игра не позволяет вам ходить по кругу, как этот, потому что пользователь решает, что может или не может быть видно, взаимодействуя со спрайтами в различном порядке, тогда вы можете сохранить ссылку на " «разбить спрайты» в отдельном массиве (сохраняя при этом и в исходном массиве - тогда вы можете просто выбрать любой объект из «неиспользуемого» массива, удалить его из этого массива и затем изменить его, как указано выше).

Это должно значительно снизить частоту смены кадров, поскольку вы не будете создавать и уничтожать спрайты все время.


Еще одна вещь, которая может происходить, это то, что вы используете разные изображения, и каждое изображение хранится отдельно (image1.png, image2.png, image3.png), и их создание / уничтожение приводит к удалению текстур и повторно добавили ... для решения этой проблемы создайте лист спрайтов и добавьте лист спрайтов в кэш текстуры, затем создайте изображения с помощью 'spriteFromSpriteCacheName: @ "image1.png"'

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