Интерполяция: физический шаг, кадр и задержка
Что интерполируется, откуда берётся alpha и почему гладкое изображение немного отстаёт от физики.
Два независимых времени
Физика обновляет состояние с фиксированным шагом, а рендер рисует при готовности кадра. VSync, ограничение FPS и переменная нагрузка не гарантируют совпадение этих событий. Привязка физики к FPS меняет поведение игры и стоимость шага; простая блокировка FPS тоже не делает времена тождественными.
Интерполятор хранит предыдущую и текущую позы. Engine.GetPhysicsInterpolationFraction возвращает долю между физическими шагами для промежуточного рисунка. Для одной координаты смысл такой: render = previous + (current - previous) × alpha. Это поясняющая формула; для transform с вращением интерполируйте положение и ориентацию подходящим алгоритмом, а не линейно смешивайте все коэффициенты матрицы.
| previous | current | alpha | render |
|---|---|---|---|
| 120 | 132 | 0 | 120 |
| 120 | 132 | 0.25 | 123 |
| 120 | 132 | 0.5 | 126 |
| 120 | 132 | 0.75 | 129 |
При следующем шаге current становится previous и появляется новая текущая поза. Обычный Position/GlobalTransform остаётся состоянием сущности, а не обещанием экранной промежуточной координаты. В 3D для визуального потребителя есть GetGlobalTransformInterpolated; у Entity2D такого одноимённого метода в SDK нет.
Цена сглаживания
Использование двух уже известных состояний означает визуальную задержку порядка физического шага. При 60 шагах/с сам шаг — около 16.7 мс; это не измерение полной задержки ввода, дисплея или сети. Реальное ощущение зависит также от камеры и способа ввода.
Экстраполяция пытается предсказать ещё неизвестное будущее, поэтому может ошибиться на столкновении или резкой смене скорости. Это другой алгоритм; свойство PhysicsInterpolationMode не включает произвольное предсказание. Интерполяция изображения не меняет физическую траекторию или количество проверок столкновений.
Проверить наблюдением
В примере 2D синий и белый квадраты получают одну X-координату на каждом шаге. У синего On, у белого Off. При 10 шагах/с и более частом рендере синий занимает промежуточные экранные положения, белый — удерживает физические положения до следующего шага. Статичный снимок показывает расположение, а разницу в плавности нужно наблюдать в движении.
Автопроверка читает центры цветных объектов из 72 последовательных кадров каждого примера 2D/3D и сравнивает число смен экранного положения. Дополнительно она сопоставляет 3D-проекцию GetGlobalTransformInterpolated с пикселями. Это проверка конкретного примера на установленном рендере, а не оценка всей производительности или задержки устройств.