В физическом движке Cannon.js управление активностью тел является критически важным для оптимизации производительности симуляции. Одним из инструментов для этого является механика засыпания тел, позволяющая отключать вычисления для объектов, находящихся в состоянии покоя.
Каждое тело в Cannon.js имеет свойство
sleepState, которое определяет его текущее
состояние активности:
CANNON.Body.AWAKE (0) — тело активно.
Все физические вычисления (силы, столкновения, интеграция) выполняются в
полной мере.CANNON.Body.SLEEPY (1) — тело почти не
движется, но ещё не полностью отключено. Это промежуточное состояние, в
котором движок следит за возможным пробуждением.CANNON.Body.SLEEPING (2) — тело
полностью «уснуло». Оно исключается из большинства вычислений, что
экономит ресурсы.Переход между этими состояниями управляется автоматическими проверками движения и силами, действующими на тело.
Чтобы определить, когда тело должно перейти в состояние покоя, Cannon.js использует два ключевых параметра:
sleepSpeedLimit — максимальная
скорость, при которой тело считается почти неподвижным. Если линейная и
угловая скорости тела опускаются ниже этого порога, оно может начать
процесс засыпания.sleepTimeLimit — минимальное время,
которое тело должно находиться ниже порога скорости, прежде чем оно
полностью «уснет». Это предотвращает преждевременное засыпание при
кратковременных колебаниях скорости.const body = new CANNON.Body({
mass: 1,
shape: new CANNON.Sphere(1)
});
// Настройка порогов засыпания
body.sleepSpeedLimit = 0.1; // скорость ниже 0.1 м/с считается покоем
body.sleepTimeLimit = 1.0; // тело должно оставаться в покое 1 секунду
Процесс засыпания тела реализуется через постепенное снижение активности:
sleepSpeedLimit дольше времени
sleepTimeLimit,
sleepState меняется с AWAKE
на SLEEPY.SLEEPY движок продолжает отслеживать малые
колебания скорости. Если тело остаётся неподвижным, оно переходит в
SLEEPING.sleepState в
AWAKE.Cannon.js предоставляет методы для прямого контроля засыпанием:
body.sleep() — принудительно переводит
тело в состояние SLEEPING, игнорируя текущую скорость и
пороги.body.wakeUp() — пробуждает тело,
возвращая ему состояние AWAKE и активируя расчёт сил и
столкновений.body.isSleeping() — возвращает
true, если тело в состоянии SLEEPING.if (body.isSleeping()) {
body.wakeUp(); // тело пробуждается при необходимости
}
Использование засыпания критично для оптимизации симуляций с большим количеством объектов:
SLEEPING,
снижая нагрузку на CPU.Помимо индивидуальных настроек для тела, можно управлять глобальной политикой засыпания через свойства World:
world.allowSleep — включает или
отключает автоматическое засыпание всех тел в мире.world.sleepSpeedLimit и
world.sleepTimeLimit — задают значения по
умолчанию для всех тел, если индивидуальные настройки отсутствуют.const world = new CANNON.World();
world.allowSleep = true;
world.sleepSpeedLimit = 0.05;
world.sleepTimeLimit = 0.5;
Эта гибкость позволяет балансировать между производительностью и точностью симуляции, управляя чувствительностью системы к малым движениям.
sleepSpeedLimit,
чтобы избежать преждевременного засыпания.allowSleep, иначе вычисления
столкновений будут непрерывными и затратными.Правильная настройка механизма sleepState и порогов засыпания позволяет сочетать реалистичную физику с высокой производительностью, что делает Cannon.js мощным инструментом для сложных 3D симуляций.