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

Что произойдет если частота кадров на устройстве не будет совпадать с выставленной в Update?

1.8 Middle🔥 141 комментариев
#Unity Core#Оптимизация

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

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

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

Синхронизация FixedUpdate и Update при несовпадении частоты

Когда частота кадров (FPS) в Update не совпадает с фиксированной частотой FixedUpdate, в Unity возникает рассогласование между графическим обновлением и физическим моделированием. По умолчанию FixedUpdate вызывается с фиксированной частотой 50 раз в секунду (каждые 0.02 секунды), в то время как Update зависит от производительности устройства и может варьироваться.

Что происходит в таком случае?

Unity использует внутренний механизм синхронизации: если Update работает медленнее, чем FixedUpdate, физика может "накопиться". Тогда за один кадр Update может быть выполнено несколько вызовов FixedUpdate подряд, чтобы догнать отставание по времени. Это приводит к следующим эффектам:

  • "Ступенчатое" или "рывками" движение визуальных объектов, привязанных к физике (например, через Rigidbody), так как их позиция обновляется несколько раз за один рендер.
  • Нестабильная физика: если FPS очень низкий, несколько итераций FixedUpdate за кадр могут привести к неожиданному поведению столкновений или сил.
  • Проблемы с управлением: ввод с клавиатуры/мыши обрабатывается в Update, а реакция физического объекта — в FixedUpdate. При рассинхронизации возникает задержка или "дребезг".

Пример кода для демонстрации

using UnityEngine;

public class FrameRateDemo : MonoBehaviour
{
    private int updateCount = 0;
    private int fixedUpdateCount = 0;
    
    void Update()
    {
        updateCount++;
        Debug.Log($"Update #{updateCount}, Time: {Time.time}");
        
        // Искусственно замедляем Update для демонстрации
        if (Time.time < 5f)
        {
            System.Threading.Thread.Sleep(100); // Задержка 100 мс
        }
    }
    
    void FixedUpdate()
    {
        fixedUpdateCount++;
        Debug.Log($"FixedUpdate #{fixedUpdateCount}, FixedTime: {Time.fixedTime}");
    }
}

В этом примере при искусственном замедлении Update вы увидите в консоли, что за один Update может вызываться несколько FixedUpdate, так как физика пытается компенсировать отставание.

Как минимизировать проблемы?

  1. Контроль частоты FixedUpdate: измените Time.fixedDeltaTime в настройках проекта или скрипте, если требуется иная точность физики.

    Time.fixedDeltaTime = 0.01f; // 100 FixedUpdate в секунду
    
  2. Использование Time.deltaTime: для плавного движения в Update всегда умножайте значения на Time.deltaTime. Это делает движение независимым от FPS.

    void Update()
    {
        transform.Translate(Vector3.forward * speed * Time.deltaTime);
    }
    
  3. Для физических объектов используйте Rigidbody.MovePosition или Rigidbody.AddForce в FixedUpdate, а не прямое изменение transform.position в Update.

  4. Оптимизация: снижайте нагрузку на Update (сложные вычисления, неоптимальные шейдеры), чтобы поддерживать стабильный FPS, близкий к целевому.

  5. Интерполяция и экстраполяция: для объектов с Rigidbody используйте RigidbodyInterpolation (в настройках компонента), чтобы сгладить движение между вызовами FixedUpdate.

В итоге, несовпадение частот — штатная ситуация, но без должной обработки она приводит к визуальным и физическим артефактам. Ключевая задача — изолировать физику в FixedUpdate и делать движение в Update независимым от кадров через Time.deltaTime.

Что произойдет если частота кадров на устройстве не будет совпадать с выставленной в Update? | PrepBro