Свойства deltaTime, deltaMS, elapsedMS

В PixiJS управление временем и синхронизация анимаций являются ключевыми аспектами работы с игровыми сценами и интерактивной графикой. Основные свойства для работы с временными интервалами — это deltaTime, deltaMS и elapsedMS, доступные через объект Ticker. Их правильное понимание позволяет реализовывать плавные анимации, независимые от производительности устройства.


deltaTime

deltaTime — это множитель времени, выраженный в количестве кадров относительно базовой скорости 60 FPS. Его основная цель — нормализовать движение объектов при различных FPS.

Формула расчета:

deltaTime = deltaMS / (1000 / 60)
  • deltaTime = 1 соответствует одному кадру при 60 FPS.
  • При 30 FPS значение deltaTime будет примерно 2, что позволяет компенсировать снижение частоты кадров.

Пример использования:

app.ticker.add((deltaTime) => {
    sprite.x += 5 * deltaTime;
});

В этом примере объект sprite перемещается на одинаковое расстояние в единицу времени, независимо от частоты кадров.

Ключевой момент: deltaTime удобен для кратких, быстрых расчетов, когда важно поддерживать скорость анимации относительно «идеального» FPS.


deltaMS

deltaMS — это реальное время между кадрами в миллисекундах. Оно не нормализовано и напрямую отражает задержку, возникающую при рендеринге:

deltaMS = текущее_время - время_прошлого_кадра

Пример использования:

app.ticker.add((deltaTime, deltaMS) => {
    sprite.x += 0.1 * deltaMS;
});
  • При значении deltaMS = 16.67 (приблизительно 60 FPS) объект переместится на 0.1 * 16.67 ≈ 1.667 пикселей.
  • При снижении FPS до 30, deltaMS ≈ 33.33, и объект переместится на 3.333 пикселя, компенсируя падение частоты кадров.

Особенности:

  • Позволяет точно учитывать реальное время, что важно для физики и временных эффектов.
  • Используется в сложных игровых механиках, где движение объектов должно быть строго привязано к миллисекундам.

elapsedMS

elapsedMS — это общее время, прошедшее с начала работы Ticker, выраженное в миллисекундах. Оно постоянно растет и служит для отслеживания абсолютного времени.

Пример использования:

app.ticker.add(() => {
    console.log(app.ticker.elapsedMS);
});
  • Позволяет синхронизировать события или анимации с абсолютным временем.
  • Используется для планирования таймеров, циклических эффектов и отслеживания длительных интервалов.

Ключевой момент: elapsedMS не зависит от FPS и не нормализуется — это чистый таймер от старта Ticker.


Сравнение и выбор свойства

Свойство Тип значения Зависимость от FPS Основное применение
deltaTime Безразмерное Нормализовано Плавное движение и анимация относительно 60 FPS
deltaMS Миллисекунды Не нормализовано Физика, временные эффекты, точные расчеты скорости
elapsedMS Миллисекунды Не нормализовано Отслеживание абсолютного времени, таймеры, события

Практические советы

  1. Для анимаций спрайтов и визуальных эффектов: Использовать deltaTime для краткости кода и удобства, когда важно сохранить скорость движения при разных FPS.

  2. Для физики или точных временных расчетов: Использовать deltaMS, чтобы движения и столкновения оставались корректными при нестабильной частоте кадров.

  3. Для отслеживания общего времени и циклов: Использовать elapsedMS, например, для запуска событий через заданные интервалы или для синхронизации музыки и анимаций.

  4. Смешанное использование: Часто удобно комбинировать deltaTime и elapsedMS, используя deltaTime для смещения объектов, а elapsedMS — для проверки условий или таймеров.


Пример комплексного использования

app.ticker.add((deltaTime, deltaMS) => {
    // Плавное смещение спрайта с нормализацией FPS
    sprite.x += 2 * deltaTime;

    // Физика объекта с учетом реального времени
    velocity += acceleration * (deltaMS / 1000);
    sprite.y += velocity * (deltaMS / 1000);

    // Вызов события каждые 2 секунды
    if (Math.floor(app.ticker.elapsedMS / 2000) !== Math.floor((app.ticker.elapsedMS - deltaMS) / 2000)) {
        console.log('Событие прошло каждые 2 секунды');
    }
});

В этом примере одновременно используются все три свойства: deltaTime для визуальной анимации, deltaMS для физики и elapsedMS для таймера. Такой подход обеспечивает точность и плавность, независимо от производительности устройства.