Оптимизация физики: спящие тела, ограничение итераций

В Phaser 3 физический движок Arcade Physics поддерживает понятие спящих тел (sleeping bodies), что позволяет существенно снизить нагрузку на CPU при большом количестве объектов. Когда объект не движется и на него не действуют внешние силы, его можно перевести в спящее состояние, при котором движок перестает рассчитывать столкновения и перемещения до момента воздействия на объект.

Для активации спящих тел используется свойство allowSleep и метод sleep():

sprite.body.allowSleep = true;  // включение возможности "спать"
sprite.body.sleep();            // перевод в спящее состояние

Основные параметры и принципы работы:

  • sleepThreshold — скорость или сила воздействия ниже которой тело считается неподвижным;
  • Тело автоматически “просыпается”, если на него воздействует сила, например столкновение с другим телом;
  • Использование спящих тел особенно эффективно для платформеров с большим количеством мелких объектов или проектилями.

Спящие тела позволяют уменьшить количество лишних вычислений, сохраняя высокую частоту кадров даже на слабых устройствах.

Ограничение количества итераций

Phaser использует итеративные методы для расчета столкновений и обработки физических контактов. Каждый кадр движок пытается разрешить все пересечения между телами, что может приводить к росту нагрузки при большом количестве объектов. Для контроля производительности применяются настройки количества итераций:

this.physics.world.setBoundsCollision(true, true, true, true);
this.physics.world.defaultContactMaterial.restitution = 0.5;
this.physics.world.maxStep = 1 / 60;       // ограничение шага симуляции
this.physics.world.overlapIterations = 2;  // количество итераций проверки пересечений
this.physics.world.positionIterations = 3; // количество итераций расчета позиции
  • positionIterations — число итераций для корректного позиционирования тел после столкновений;
  • overlapIterations — число итераций для проверки наложений (overlap);
  • Снижение этих значений уменьшает нагрузку на процессор, но может привести к менее точной физике, особенно при столкновениях нескольких объектов;
  • Рекомендуется подобрать баланс между производительностью и точностью, исходя из типа игры и количества объектов на сцене.

Совмещение спящих тел и ограничения итераций

Для достижения оптимальной производительности в сложных сценах целесообразно совмещать оба подхода:

  1. Активировать спящие тела для неподвижных объектов.
  2. Снизить количество итераций, ориентируясь на характер столкновений.
  3. Разделять объекты на группы — динамические и статические — чтобы для статических тел можно было применять минимальные вычисления.

Пример эффективной оптимизации:

// Статические платформы
platforms.children.each(platform => {
    platform.body.immovable = true;
    platform.body.allowSleep = true;
    platform.body.sleep();
});

// Динамические игроки и враги
players.children.each(player => {
    player.body.positionIterations = 2;
    player.body.overlapIterations = 1;
});

Такой подход снижает количество операций на кадр, повышая стабильность игры на устройствах с ограниченными ресурсами, не жертвуя качеством физики там, где это критично.

Настройка World Bounds и спящих тел

Phaser позволяет комбинировать ограничения мира (world bounds) с физикой спящих тел, что особенно полезно для платформеров и боковых скроллеров:

this.physics.world.setBounds(0, 0, 800, 600, true, true, true, true);
this.physics.world.bounds.width = 800;
this.physics.world.bounds.height = 600;
this.physics.world.bounds.inactive = true; // границы как спящие тела

Эта настройка уменьшает количество проверок для объектов, находящихся вне видимой зоны, что дополнительно снижает нагрузку.

Практические советы по оптимизации

  • Не использовать активную физику для объектов, которые не участвуют в взаимодействии на данный момент;
  • Для больших групп мелких объектов (пули, частицы) использовать group.setVelocity(0) и sleep() при отсутствии движения;
  • Ограничивать количество одновременных столкновений через слои (collision groups), чтобы движок проверял только нужные пары;
  • Проверять реальную производительность на разных устройствах, так как высокая точность итераций может быть критична на десктопе, но неоправданна на мобильных.

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