В чем разница между Update и FixedUpdate в Unity, и стоит ли мне беспокоиться?
10
Мне сказали использовать Update()для графики и FixedUpdate()для физики, но иногда мои входы не регистрируются, когда я использую FixedUpdate(). Это работает хорошо, если я использую Update()для всего, хотя.
Должен ли я беспокоиться FixedUpdate(), или я делаю что-то не так?
FixedUpdateможет работать быстрее или медленнее, чем в Updateзависимости от ваших настроек. Это будет зависеть от нагрузки (скорость Updateработы) и скорости, которую вы установили FixedUpdate(см. «Правка» - «Настройки проекта» -> «Время»). В идеале, поскольку Updateон запускается один раз за кадр, именно здесь вы хотите захватить ввод. Если вам нужно воздействовать на входные данные в FixedUpdateметоде (например, управлять физическими телами), установите флаги и Updateобработайте их FixedUpdate:
Хорошей идеей по-прежнему является управление физикой с помощью FixedUpdateметода, поскольку вряд ли физику нужно обновлять так часто, а физику при фиксированном обновлении предсказать гораздо проще ( детерминизм ), чем физику при обновлении переменной.
что если вместо условия bool (es.GetMouseButtonDown) нам нужно прочитать значение с оси (Input.GetAxis ("Horizontal"))? Если обновление выполняется больше, чем FixedUpdate, что вы посоветуете в этом случае? Должны ли мы в конечном итоге рассмотреть возможность вычисления среднего значения оси, возникшей во время нескольких обновлений, перед тем как использовать его в обновлении? (+1 между прочим)
Heisenbug
Как узнать, насколько быстро работает мой FixedUpdate?
Токамоча
1
@Tokamocha Скорость фиксированного обновления устанавливается в «Правка» -> «Настройки проекта» -> «Время».
MichaelHouse
@Heisenbug Лично я бы просто использовал последнее значение и посмотрел, насколько хорошо это работает. Если я получу неожиданные результаты, я могу вычислить скользящее среднее значение оси, пока оно не будет обработано FixedUpdate. Это одна из тех вещей, которая требует некоторого игрового тестирования, чтобы действительно понять, что «чувствует» правильно.
MichaelHouse
1
В недавних тестах я обнаружил, что, вопреки тому, что подразумевается в документации, новые флаги ввода уже доступны в FixedUpdate (по крайней мере на ПК). Таким образом, установка флага в Update и последующее действие над ним в следующем FixedUpdate после этого (т. Е. В следующем кадре), как показано здесь, может фактически добавить задержку в игру относительно обработки ввода непосредственно в FixedUpdate. Это требует некоторой осторожности, чтобы избежать двойной обработки ввода в кадрах с несколькими FixedUpdate или пропусков ввода в кадрах без FixedUpdate.
DMGregory
7
Вы должны понимать, что каждый из них делает. Update()вызывается как можно чаще (не уверен, может быть, его можно ограничить), в любом случае - каждый кадр. FixedUpdate()вызывается каждый постоянный промежуток времени (следовательно, «фиксированный»).
Ввод идет Update()так же просто (потому что, как вы заметили, FixedUpdate()может не перехватить событие ввода). Логика игры, однако, может войти в любую из них. Физика должна быть детерминированным , и поэтому она должна быть FixedUpdate(). Другие вещи не должны. В зависимости от использования вы должны решить, какая функция подходит.
Кроме того, стоит сказать, что в некоторых приложениях есть обновление всей игровой логики FixedUpdate()(даже вне ее Unity) - это называется «цикл игры с фиксированным шагом». Наличие всего кода обновления в функции с фиксированным шагом дает вам детерминизм и повышает вероятность того, что ваше приложение будет вести себя одинаково каждый раз (и на каждом устройстве). Также учитывает некоторые необычные функции, такие как повторы.
Итак, если я помещу все в FixedUpdate (), моя игра все равно будет регистрировать все входные данные, верно?
Токамоча
1
Нет, вы можете поместить туда все обновления логики игры, но не проверку ввода.
NPS
2
Этот ответ полон недостоверной информации. Прежде всего FixedUpdate вызывается 1 / fixedDeltaTime раз в секунду , а не каждый n: th fixedDeltaTime. Во-вторых, игровая логика всегда должна идти в FixedUpdate, так как это облегчает анализ. Обновление предназначено только для целей рендеринга (я знаю, что почти никто в сообществе Unity не следит за этим, но это действительно так, как и должно быть). В-третьих, FixedUpdate и его связь с физическим движком не имеют ничего общего с детерминизмом.
FixedUpdate
. Это одна из тех вещей, которая требует некоторого игрового тестирования, чтобы действительно понять, что «чувствует» правильно.Вы должны понимать, что каждый из них делает.
Update()
вызывается как можно чаще (не уверен, может быть, его можно ограничить), в любом случае - каждый кадр.FixedUpdate()
вызывается каждый постоянный промежуток времени (следовательно, «фиксированный»).Ввод идет
Update()
так же просто (потому что, как вы заметили,FixedUpdate()
может не перехватить событие ввода). Логика игры, однако, может войти в любую из них. Физика должна быть детерминированным , и поэтому она должна бытьFixedUpdate()
. Другие вещи не должны. В зависимости от использования вы должны решить, какая функция подходит.Кроме того, стоит сказать, что в некоторых приложениях есть обновление всей игровой логики
FixedUpdate()
(даже вне ееUnity
) - это называется «цикл игры с фиксированным шагом». Наличие всего кода обновления в функции с фиксированным шагом дает вам детерминизм и повышает вероятность того, что ваше приложение будет вести себя одинаково каждый раз (и на каждом устройстве). Также учитывает некоторые необычные функции, такие как повторы.источник