Найти в Дзене

В чем отличие методов Update() и FixedUpdate()

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

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

В зависимости от сложности вычислений в коде и скорости рендеринга, время между готовностью разных кадров может различаться. Эти промежутки называются циклом обновления (Update loop), который зависит от графического движка Unity.

Таким образом метод Update() соответствует циклу обновления Update loop графического движка Unity и вызывается перед визуализацией каждого кадра.

В методе Update() можно перемещать нефизические объекты (которые не имеют компонента «Rigidbody»), считывать пользовательские действия (нажатие клавиши клавиатуры, мыши, джойстика и т.д.), менять состояние аниматора, то есть выполнять действия, связанные с тем, что мы видим на экране.

Но, если мы будем изменять положение физического тела в Update loop, то можем получить баги в игре - например, физическое тело может начать притормаживать или дергаться. Физические вычисления не должны зависеть от обновления графики, они должны быть стабильными и обновляться через равные промежутки времени.

В Unity есть еще один отдельный цикл Fixed Update loop, который выполняет все физические операции. Этот цикл обновляется через равные промежутки времени, по умолчанию 0,02 секунды или 50 вызовов в секунду (это значение можно изменить в настройках). Метод, соответствующий этому циклу, называется FixedUpdate().

Таким образом, если графический движок отрисовывает 100 кадров в секунду, то метод Update () выполнится 100 раз в секунду. Если графический движок сможет за секунду отрисовать только 60 кадров, то метод Update () выполнится 60 раз в секунду. А вот метод FixedUpdate() будет выполняться 50 раз в секунду в любом случае, независимо от частоты обновления кадров.

Рисунок 1. Вызов методов Update() и FixedUpdate()
Рисунок 1. Вызов методов Update() и FixedUpdate()

Так как метод FixedUpdate() вызывается непосредственно перед каждым обновлением физики, то любые изменения физического тела, описанные в нем, будут обрабатываться напрямую. Поэтому этот метод следует использовать для применения сил и крутящих моментов, связанных с физикой игрового объекта.

Рисунок 2. Использование методов Update() и FixedUpdate()
Рисунок 2. Использование методов Update() и FixedUpdate()