В Phaser 3 физический движок Arcade Physics поддерживает понятие спящих тел (sleeping bodies), что позволяет существенно снизить нагрузку на CPU при большом количестве объектов. Когда объект не движется и на него не действуют внешние силы, его можно перевести в спящее состояние, при котором движок перестает рассчитывать столкновения и перемещения до момента воздействия на объект.
Для активации спящих тел используется свойство
allowSleep и метод sleep():
sprite.body.allowSleep = true; // включение возможности "спать"
sprite.body.sleep(); // перевод в спящее состояние
Основные параметры и принципы работы:
Спящие тела позволяют уменьшить количество лишних вычислений, сохраняя высокую частоту кадров даже на слабых устройствах.
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; // количество итераций расчета позиции
Для достижения оптимальной производительности в сложных сценах целесообразно совмещать оба подхода:
Пример эффективной оптимизации:
// Статические платформы
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;
});
Такой подход снижает количество операций на кадр, повышая стабильность игры на устройствах с ограниченными ресурсами, не жертвуя качеством физики там, где это критично.
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 и с сохранением реалистичного поведения тел.