Игровой цикл
Как Phaser 4 планирует update и render, что означает delta и как писать код, независимый от частоты кадров.
Каждый кадр Phaser выполняет примерно следующее:
- Опустошает очередь ввода (события указателя, клавиатуры, геймпада, полученные с прошлого кадра).
- Вызывает
update(time, delta)каждой активной сцены. - Выполняет шаг физического мира.
- Отрисовывает список отображения на канвас.
time — это монотонная отметка времени в миллисекундах; delta — число миллисекунд, прошедших с предыдущего кадра.
Независимость от частоты кадров
Самое важное правило:
Умножайте перемещение и скорости на
delta, а не на константу.
// Неправильно — при 144fps ваш спрайт движется в 2,4 раза быстрее.
sprite.x += 5;
// Правильно — скорость в «пикселях в секунду», независимо от частоты кадров.
sprite.x += 200 * (delta / 1000);
Это касается физических скоростей, которые вы задаёте вручную, таймеров анимации, темпов эмиссии частиц и всего остального, что выражается «в секунду».
Фиксированный шаг против переменного шага
По умолчанию Phaser использует переменный шаг времени — delta отражает то, что произошло на самом деле. Для детерминированной симуляции (синхронный (lockstep) мультиплеер, записанные повторы) используйте цикл с фиксированным шагом внутри update:
private accumulator = 0;
private readonly STEP = 1000 / 60;
update(_time: number, delta: number) {
this.accumulator += delta;
while (this.accumulator >= this.STEP) {
this.tick(this.STEP);
this.accumulator -= this.STEP;
}
}
Связанные темы
- Сцены — где располагается покадровый
update. - Руководства по физике — о том, как выполняется шаг физического мира относительно основного цикла.