Timer
Модуль для управления таймерами и интервалами, основанный на requestAnimationFrame. В отличие от стандартных setTimeout и setInterval, таймеры зависят от FPS игры, что делает их безопасными при работе в фоновом режиме, а также позволяет синхронизировать их со скоростью игры.
Назначение
Модуль решает следующие задачи:
- Создание таймеров с задержкой
- Создание периодических интервалов
- Асинхронные задержки через Promise
- Безопасная работа в фоновом режиме
- Синхронизация с игровым циклом
Архитектура
Модуль состоит из следующих компонентов:
-
TimerController - основной контроллер:
- Управление таймерами и интервалами
- Обновление на каждом кадре
- Синхронизация с deltaTime
-
Timer - реализация одноразового таймера:
- Отсчет времени
- Выполнение колбэка по завершении
- Автоматическое удаление
-
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;
}
Особенности реализации
-
Синхронизация с FPS:
- Таймеры обновляются в игровом цикле
- Учитывается реальное время между кадрами
- Компенсируются просадки FPS
-
Безопасность в фоне:
- Таймеры приостанавливаются вместе с игрой
- Нет накопления задержки
- Корректная работа при потере фокуса
-
Управление памятью:
- Автоматическая очистка завершенных таймеров
- Возможность ручной остановки
- Предотвращение утечек памяти
FAQ
Когда использовать TimerController вместо стандартных таймеров?
Используйте TimerController когда:
- Нужна синхронизация с игровым циклом
- Важна работа в фоновом режиме
- Требуется компенсация просадок FPS
Как работает компенсация пропущенных тиков?
Интервалы накапливают прошедшее время и могут выполнить несколько тиков за одно обновление, если было пропущено много времени (например, при низком FPS).
Можно ли использовать в не-игровых приложениях?
Да, но это избыточно. TimerController специально разработан для игровых сценариев и синхронизации с requestAnimationFrame.