Между тем, помогая студентам в моем университете, болтаясь вокруг разногласий Unreal Slackers и помогая с запросами чертежей, я заметил, что люди без опыта программирования, как правило, либо слишком боятся когда-либо прикасаться к чему-либо, связанному с тиком, либо используют его небрежно до такой степени, что это становится препятствием для производительности. Имея это в виду, эта статья должна помочь объяснить, как эффективно использовать Event Tick.

Событийный менталитет

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

Тем не менее, такие вещи, как

  • Пользовательское движение персонажа
  • Динамическая анимация камеры
  • Динамические изменения звука персонажа
  • Процедурные анимации
  • Передача позиций актеров в материал постобработки

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

Основанный на событии не означает, что это не может произойти с течением времени

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

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

  • Физические силы (исключая импульсы)
  • Интерполяция значений (lerp, slerp, interp, легкость и т. д.)

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

  • Выстрелы из оружия
  • Записи данных
  • Перезарядка способностей.

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

Советы по производительности

По умолчанию почти у каждого актера в Unreal включен Tick, а это означает, что любой созданный вами план будет иметь включенный Tick, поэтому подумайте об отключении его, если вы не собираетесь его использовать.

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

Некоторые примечания по пользовательскому интерфейсу

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

Возможно, самая большая экономия производительности, когда речь идет о UMG, — это привязки , чем меньше их у вас , тем лучше. Использование галочки события виджета и управление несколькими объектами более эффективно, чем выполнение одного и того же кода в нескольких привязках.

Выводы

Если ваш код запускается и останавливается контекстно, он, вероятно, не должен быть на Event Tick. Однако во всем есть исключения. И хотя в этой статье объясняются некоторые полезные практики/концепции и методологии, вам не нужно навязывать их заранее, вы как бы врастаете в этот стиль кодирования. Сначала вашим приоритетом должно быть время итерации, а не производительность. Быстрее оптимизировать то, что, как вы знаете, работает и соответствует вашей цели, чем оптимизировать что-то на ранней стадии и препятствовать вашей итерации позже, когда вам нужно это изменить.