~1 мин чтения

Игровой цикл

Как Phaser 4 планирует update и render, что означает delta и как писать код, независимый от частоты кадров.

Каждый кадр Phaser выполняет примерно следующее:

  1. Опустошает очередь ввода (события указателя, клавиатуры, геймпада, полученные с прошлого кадра).
  2. Вызывает update(time, delta) каждой активной сцены.
  3. Выполняет шаг физического мира.
  4. Отрисовывает список отображения на канвас.

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.
  • Руководства по физике — о том, как выполняется шаг физического мира относительно основного цикла.