Снижение числа активных тел через sleep

В физическом движке Cannon.js управление активностью тел играет ключевую роль в оптимизации производительности. Когда сцена содержит большое количество объектов, постоянный расчёт столкновений и интеграции всех тел приводит к значительным затратам ресурсов. Механизм sleep позволяет автоматически переводить объекты в состояние покоя, снижая нагрузку на вычисления.


Принцип работы sleep

Каждое тело в Cannon.js имеет состояние активности, которое может быть:

  • Активное (awake) — тело участвует в интеграции движения и проверке столкновений.
  • Спящее (sleeping) — тело временно исключается из расчётов физики.

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


Настройка механизма sleep

Для управления переходом тел в спящее состояние используются несколько параметров:

  1. allowSleep Логическое свойство тела.

    body.allowSleep = true;

    Если false, тело никогда не будет засыпать, что увеличивает нагрузку.

  2. sleepSpeedLimit Максимальная линейная скорость, ниже которой тело может заснуть.

    body.sleepSpeedLimit = 0.1; // единицы скорости
  3. sleepTimeLimit Минимальное время (в секундах), в течение которого тело должно двигаться медленнее sleepSpeedLimit для перехода в спящее состояние.

    body.sleepTimeLimit = 1.0; // тело должно быть медленным 1 секунду
  4. 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 позволяет:

  • Уменьшить количество активных тел в каждый момент времени.
  • Снизить количество проверок столкновений.
  • Увеличить FPS при сложных сценах.

Важно выбирать умеренные значения sleepSpeedLimit и sleepTimeLimit, чтобы объекты не «засыпали» преждевременно, что могло бы вызвать некорректное поведение симуляции.


Взаимодействие с внешними силами

Если спящее тело получает внешнее воздействие (удар, сила, столкновение), оно автоматически просыпается. Это происходит благодаря встроенной проверке изменений скорости и импульсов. Программное пробуждение через wakeUp() позволяет контролировать активацию тела в критических ситуациях, например при интерактивном взаимодействии с пользователем.


Советы по оптимизации

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

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