В чем разница между Update и FixedUpdate в Unity, и стоит ли мне беспокоиться?


10

Мне сказали использовать Update()для графики и FixedUpdate()для физики, но иногда мои входы не регистрируются, когда я использую FixedUpdate(). Это работает хорошо, если я использую Update()для всего, хотя.

Должен ли я беспокоиться FixedUpdate(), или я делаю что-то не так?

Ответы:


10

FixedUpdateможет работать быстрее или медленнее, чем в Updateзависимости от ваших настроек. Это будет зависеть от нагрузки (скорость Updateработы) и скорости, которую вы установили FixedUpdate(см. «Правка» - «Настройки проекта» -> «Время»). В идеале, поскольку Updateон запускается один раз за кадр, именно здесь вы хотите захватить ввод. Если вам нужно воздействовать на входные данные в FixedUpdateметоде (например, управлять физическими телами), установите флаги и Updateобработайте их FixedUpdate:

bool leftMouseDown = false;

void Update()
{
    if(Input.GetMouseButtonDown(0))
        leftMouseDown = true;
}

void FixedUpdate()
{
    if(leftMouseDown )
    {
        //update physics bodies with input
        leftMouseDown = false;
    }
}

Хорошей идеей по-прежнему является управление физикой с помощью 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 и его связь с физическим движком не имеют ничего общего с детерминизмом.
Thr
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.