В физическом движке Cannon.js управление активностью тел играет ключевую роль в оптимизации производительности. Когда сцена содержит большое количество объектов, постоянный расчёт столкновений и интеграции всех тел приводит к значительным затратам ресурсов. Механизм sleep позволяет автоматически переводить объекты в состояние покоя, снижая нагрузку на вычисления.
Каждое тело в Cannon.js имеет состояние активности, которое может быть:
Переход между состояниями осуществляется автоматически на основе скорости тела и времени его покоя. Если тело движется с минимальной скоростью и не испытывает внешних воздействий, оно может быть переведено в спящее состояние, экономя ресурсы CPU.
Для управления переходом тел в спящее состояние используются несколько параметров:
allowSleep Логическое свойство тела.
body.allowSleep = true;
Если false, тело никогда не будет засыпать, что
увеличивает нагрузку.
sleepSpeedLimit Максимальная линейная скорость, ниже которой тело может заснуть.
body.sleepSpeedLimit = 0.1; // единицы скоростиsleepTimeLimit Минимальное время (в секундах), в
течение которого тело должно двигаться медленнее
sleepSpeedLimit для перехода в спящее состояние.
body.sleepTimeLimit = 1.0; // тело должно быть медленным 1 секундуwakeUp() и sleep() Методы позволяют программно переводить тело в активное или спящее состояние.
body.sleep(); // перевести тело в спящее
body.wakeUp(); // разбудить телоДля сцены с большим количеством динамических объектов эффективнее включать sleep для тел, которые часто остаются неподвижными после столкновений. Например, кубы в стопке после падения:
const world = new CANNON.World();
world.gravity.set(0, -9.82, 0);
for (let i = 0; i < 100; i++) {
const shape = new CANNON.Box(new CANNON.Vec3(1, 1, 1));
const body = new CANNON.Body({ mass: 1 });
body.addShape(shape);
body.position.set(Math.random() * 10, 10 + i * 2, Math.random() * 10);
// Включение sleep для оптимизации
body.allowSleep = true;
body.sleepSpeedLimit = 0.05;
body.sleepTimeLimit = 0.5;
world.addBody(body);
}
В этом примере объекты, после того как останавливаются на земле, перестают участвовать в интеграции движения, существенно снижая нагрузку на физический движок.
Использование sleep особенно важно для симуляций с тысячами тел, где большинство объектов остаются неподвижными большую часть времени. Без sleep каждый объект рассчитывается на каждом кадре, что приводит к линейному увеличению вычислительной нагрузки.
Включение sleep позволяет:
Важно выбирать умеренные значения
sleepSpeedLimit и sleepTimeLimit,
чтобы объекты не «засыпали» преждевременно, что могло бы вызвать
некорректное поведение симуляции.
Если спящее тело получает внешнее воздействие (удар, сила,
столкновение), оно автоматически просыпается. Это
происходит благодаря встроенной проверке изменений скорости и импульсов.
Программное пробуждение через wakeUp() позволяет
контролировать активацию тела в критических ситуациях, например при
интерактивном взаимодействии с пользователем.
Механизм sleep в Cannon.js — простой и эффективный способ значительно повысить производительность сложных симуляций, особенно при работе с большим количеством тел.