Перейти к основному содержимому

Timer

Модуль для управления таймерами и интервалами, основанный на requestAnimationFrame. В отличие от стандартных setTimeout и setInterval, таймеры зависят от FPS игры, что делает их безопасными при работе в фоновом режиме, а также позволяет синхронизировать их со скоростью игры.

Назначение

Модуль решает следующие задачи:

  • Создание таймеров с задержкой
  • Создание периодических интервалов
  • Асинхронные задержки через Promise
  • Безопасная работа в фоновом режиме
  • Синхронизация с игровым циклом

Архитектура

Модуль состоит из следующих компонентов:

  1. TimerController - основной контроллер:

    • Управление таймерами и интервалами
    • Обновление на каждом кадре
    • Синхронизация с deltaTime
  2. Timer - реализация одноразового таймера:

    • Отсчет времени
    • Выполнение колбэка по завершении
    • Автоматическое удаление
  3. Interval - реализация периодического интервала:

    • Периодическое выполнение
    • Накопление времени
    • Компенсация пропущенных тиков

Использование

Таймеры

const timerController = new TimerController();

// Создание таймера на 1 секунду
const timerId = timerController.setTimeout(() => {
console.log('Таймер завершен');
}, 1000);

// Отмена таймера
timerController.clear(timerId);

Интервалы

// Создание интервала с периодом 500мс
const intervalId = timerController.setInterval(() => {
console.log('Тик интервала');
}, 500);

// Остановка интервала
timerController.clear(intervalId);

Асинхронные задержки

// Создание задержки
const sleep = timerController.sleep(1000);

// Ожидание через await
await sleep.wait();

// Или досрочное завершение
sleep.resolve();

API

TimerController

Методы

  • setTimeout(callback: () => void, duration: number): string - создает таймер
  • setInterval(callback: () => void, duration: number): string - создает интервал
  • sleep(duration: number): ISleep - создает асинхронную задержку
  • clear(uuid: string): void - останавливает таймер или интервал
  • update(deltaTime: number): void - обновляет все таймеры и интервалы

Интерфейсы

interface ISleep {
id: string;
wait: () => Promise<void>;
resolve: () => void;
}

interface IUpdatable {
update(deltaTime: number): void;
}

Особенности реализации

  1. Синхронизация с FPS:

    • Таймеры обновляются в игровом цикле
    • Учитывается реальное время между кадрами
    • Компенсируются просадки FPS
  2. Безопасность в фоне:

    • Таймеры приостанавливаются вместе с игрой
    • Нет накопления задержки
    • Корректная работа при потере фокуса
  3. Управление памятью:

    • Автоматическая очистка завершенных таймеров
    • Возможность ручной остановки
    • Предотвращение утечек памяти

FAQ

Когда использовать TimerController вместо стандартных таймеров?

Используйте TimerController когда:

  • Нужна синхронизация с игровым циклом
  • Важна работа в фоновом режиме
  • Требуется компенсация просадок FPS

Как работает компенсация пропущенных тиков?

Интервалы накапливают прошедшее время и могут выполнить несколько тиков за одно обновление, если было пропущено много времени (например, при низком FPS).

Можно ли использовать в не-игровых приложениях?

Да, но это избыточно. TimerController специально разработан для игровых сценариев и синхронизации с requestAnimationFrame.