← Назад к вопросам

Что такое deltaTime и fixedDeltaTime? В чем разница между ними?

1.3 Junior🔥 271 комментариев
#Unity Core

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Разница между Time.deltaTime и Time.fixedDeltaTime

В Unity существует два фундаментальных способа отслеживания времени между кадрами, и понимание разницы между ними критически важно для создания стабильной и предсказуемой игры. Основное различие заключается в привязке к разным циклам обновления: Time.deltaTime связан с кадрово-зависимым обновлением в Update(), а Time.fixedDeltaTime — с фиксированным обновлением в FixedUpdate().

Time.deltaTime: Кадрово-зависимое время

Time.deltaTime — это время в секундах, прошедшее с момента завершения последнего кадра до текущего. Его значение непостоянно и напрямую зависит от частоты кадров (FPS) игры.

  • Использование: Применяется внутри метода Update(), который вызывается каждый рендеринговый кадр. Частота вызова напрямую зависит от нагрузки на CPU/GPU и сложности сцены.
  • Основная цель: Создание плавной и кадро-независимой анимации и перемещений. Умножение скорости на deltaTime гарантирует, что объект будет двигаться с одной и той же скоростью в секунду, независимо от того, работает игра на 30 FPS или 300 FPS.
void Update()
{
    // Перемещение объекта вперед со скоростью 5 метров в секунду,
    // независимо от частоты кадров.
    float translation = 5.0f * Time.deltaTime;
    transform.Translate(0, 0, translation);
}

Time.fixedDeltaTime: Фиксированный интервал времени

Time.fixedDeltaTime — это константное значение, определяющее интервал между вызовами физического движка. По умолчанию в Unity оно равно 0.02 секунды (50 раз в секунду).

  • Использование: Применяется внутри метода FixedUpdate(), который вызывается с фиксированной частотой, заданной fixedDeltaTime.
  • Основная цель: Обеспечение стабильных и детерминированных вычислений физики. Движок физики Unity (PhysX) требует постоянного шага времени для точного расчёта коллизий, сил и других физических взаимодействий. Все физические компоненты (Rigidbody, CharacterController) обновляются в этом цикле.
void FixedUpdate()
{
    // Применение постоянной силы к Rigidbody.
    // Сила будет применяться предсказуемо каждые 0.02 секунды.
    float force = 10.0f;
    GetComponent<Rigidbody>().AddForce(Vector3.forward * force);
}

Ключевые различия и практические следствия

ХарактеристикаTime.deltaTimeTime.fixedDeltaTime
Цикл обновленияUpdate() / LateUpdate()FixedUpdate()
ЗначениеПеременное, зависит от FPSКонстантное (по умолчанию 0.02с)
Область примененияВизуальные эффекты, анимация, ввод пользователя, общая логика игрыФизические расчёты, всё, что связано с Rigidbody
ДетерминизмНедетерминирован (зависит от производительности)Детерминирован (фиксированный шаг)

Важные нюансы:

  1. Нельзя смешивать: Категорически не рекомендуется использовать Time.deltaTime внутри FixedUpdate() и наоборот. Это приведёт к некорректному поведению (например, "прыгающей" или ускоренной физике).
  2. Изменение fixedDeltaTime: Значение можно изменить в Edit -> Project Settings -> Time, но это напрямую влияет на точность физических симуляций. Уменьшение шага (например, до 0.005) повысит точность, но увеличит нагрузку на CPU. Увеличение шага снизит нагрузку, но сделает физику менее плавной.
  3. Проблема "спайков" производительности: Если кадр (Update) длится дольше, чем fixedDeltaTime, физический движок может вызвать FixedUpdate() несколько раз подряд, чтобы "нагнать" упущенное реальное время. Это может приводить к неожиданным скачкам в вычислениях, если логика в FixedUpdate() слишком тяжёлая.
  4. Для UI и плавной интерполяции: Часто для движения объектов, которыми управляет физика, но которые должны выглядеть гладко на любом FPS, используют интерполяцию (Rigidbody.interpolation). В этом случае Rigidbody вычисляет своё положение в FixedUpdate(), а рендеринг между этими фиксированными шагами сглаживается, используя данные Update().

Вывод: Time.deltaTime — это ваш инструмент для рендеринга и плавности, привязанный к реальному времени рендеринга кадра. Time.fixedDeltaTime — это часы физического движка, обеспечивающие стабильный, предсказуемый мир, где законы физики работают одинаково на любом компьютере. Правильное разделение их областей применения — основа профессиональной разработки в Unity.