Введите по кадру или по таймеру - что лучше использовать для обновления в AS3? - PullRequest
0 голосов
/ 13 июля 2010

Итак, у меня около сотни плиток карты, и у каждого заголовка есть какой-то объект, который делает что-то. И одна из вещей, которую он должен сделать, это обновить текст (время, после которого вам нужно что-то сделать) в текстовом поле. Как мне сделать это лучше - с событием ввода фрейма и при каждом вводе фрейма обновлять его или устанавливать объект таймера, который каждую секунду будет обновлять текст в текстовом поле? Интересно больше с точки зрения производительности, что было бы лучше.

Ответы [ 3 ]

3 голосов
/ 14 июля 2010

Вы должны использовать события кадра в любое время, когда хотите выполнить обработку, которая в конечном итоге влияет на то, что отображается на экране.Если вы перемещаете изображения, изменяете размер визуального содержимого, делаете программную анимацию или что-то в этом роде, вам следует использовать события кадра.Причины, по которым это может быть довольно сложным, но на простейшем уровне сводятся к следующему: если вы выполняете такую ​​обработку более одного раза между обновлениями экрана, вы теряете производительность без причины, и если вы делаете это реже, выполучить изменчивые визуальные эффекты.Использование таймера для выполнения действий с той же скоростью, что и частота кадров, может показаться альтернативой, но вы потратите определенное количество времени не синхронизировано.То есть, даже если ваш контент составляет 25FPS и вы запускаете таймер с задержкой 40 мс, из-за небольших колебаний времени, иногда это событие таймера срабатывает дважды между перерисовками, а иногда пропускается.Это могло бы стоить того, если бы было какое-то огромное неотъемлемое преимущество использования Timer, но это не так.

С другой стороны, каждый раз, когда вы хотите сделать что-то, что происходит намного реже, чем обновления экрана,Таймер хороший вариант.Проще сделать событие таймера, которое срабатывает через 5 секунд, чем создать слушатель фрейма, который насчитывает до 200. (Но будьте осторожны при смешивании событий кадра и таймеров вместе - см. здесь .)

В заключение несколько слов о производительности: не имеет значения, какую вы используете.Или, скорее, любая разница будет незначительной по сравнению с рендерингом и тем, что вы делаете внутри фрейма или событий таймера.Что может иметь небольшое значение, так это минимизировать издержки - если вы делаете много разных вещей в каждом кадре, используете один прослушиватель событий и заставляете его вызывать все функции, которые должны запускаться, вместо использования большого количества слушателей.И то же самое касается таймеров.Но даже это, на самом деле, вряд ли ухудшит вашу производительность, если вы не используете много сотен слушателей.Вы всегда должны начинать любым простым способом, а потом беспокоиться о производительности, если тестирование показывает, что у вас есть узкое место.

0 голосов
/ 12 мая 2013

Я не согласен с феномами. Существует множество причин, по которым вы можете обновлять свой код чаще, чем fps. Однако есть много разных способов сделать это. Самый простой способ - использовать событие ENTER_FRAME в качестве основной функции для ваших обновлений, а внутри этой функции оценивать прошедшее время. Затем вы можете запускать обновления несколько раз или использовать время в качестве значения, передаваемого вашим объектам, чтобы они обновлялись соответствующим образом. Таким образом, ваш игровой процесс остается плавным, даже если fps упадет, и у вас не будет проблем позже.

Кроме того, хотя я согласен, что вам следует избегать преждевременной оптимизации, хороший код с самого начала лучше, чем переделывать половину игрового движка, когда игра была близка к завершению.

0 голосов
/ 14 июля 2010

Объект Timer, вероятно, будет в любом случае прослушивать событие ENTER_FRAME для обоснования своих расчетов. Поскольку это новый объект, он также потребляет немного памяти и, возможно, больше в зависимости от внутренней работы. Это действительно будет проблемой, если вы создадите много экземпляров класса Timer.

Предполагая, что это какой-то динамический мир, который вы создаете, скорее всего, у вас уже есть основной игровой цикл, который вызывается для события ENTER_FRAME. Именно здесь вы будете перебирать все ваши плитки и соответственно обновлять текст. Вам может понадобиться сохранить некоторые временные метки или что-то в этом роде, если вам нужно записать, как долго тайл что-то делал ... трудно сказать на самом деле без подробного описания происходящего:)

...