Завершаем цикл постов про методы Update. Сегодня разберём, как ведут себя Update и LateUpdate, если игра подвисает.
Эти методы работают очень просто: кадр вызвался → методы вызвались.
Они не пытаются “догнать” пропущенные вызовы, как это делает FixedUpdate.
То есть один кадр = один вызов метода.
Теоретически при длительном зависмании нас может спасти Time.deltaTime, потому что он учитывает время между кадрами. Но тут есть важный нюанс.
У Time.deltaTime есть ограничение - Time.maximumDeltaTime (в инспекторе это Maximum Allowed Timestep).
Это означает, что значение Time.deltaTime никогда не будет больше ~0.333 секунды.
Подробнее можно почитать в документации:
https://docs.unity3d.com/ru/530/Manual/TimeFrameManagement.html
https://docs.unity3d.com/6000.3/Documentation/Manual/time-handling-variations.html
Как это выглядит на практике
Вспомним простой код движения:
private void Update()
{
transform.position += Vector3.forward * 10f * Time.deltaTime; // 10 м/с
}
Если игра подвиснет на 2 секунды, то Time.deltaTime всё равно будет равен 0.33.
В итоге - ожидали пройти 20 метров, а фактически пройдём 3.3 метра. Потому что deltaTime ограничен.
Можно ли это исправить?
Технически - да.
Можно использовать:
• Time.unscaledDeltaTime - deltaTime без ограничений
• Time.realtimeSinceStartup - реальное время с момента запуска приложения
Но это почти всегда плохая идея для игровой логики.
Если игра подвиснет, объект может “телепортироваться” на большое расстояние.
Кроме этого:
• физика не будет успевать за объектом
• логика станет сложнее
• нагрузка на CPU может увеличиться
По сути, можно раскрутить “спираль смерти”-— когда из-за лагов система начинает лагать ещё сильнее.
Когда это всё-таки имеет смысл
Использовать unscaledDeltaTime имеет смысл там, где важно реальное время, а не игровое.
Например, для таймера UI:
private void Update()
{
_uiTimer += Time.unscaledDeltaTime;
UpdateUITimerText(_uiTimer);
}
А что насчёт LateUpdate?
LateUpdate работает по тем же принципам, что и Update.
Единственная разница - порядок вызова. Сначала Update, потом LateUpdate.
То есть всё, что мы разобрали про Update (ограничение deltaTime, поведение при фризах и т.д.), полностью применимо и к LateUpdate.
Если понимать эти механизмы под капотом, можно без труда отвечать на каверзные вопросы на собеседованиях и, что важнее, писать более предсказуемую игровую логику.
🚀 Пост Guru Unity: @Minerope