Спящий режим: порог активации и деактивация

Спящий режим (sleeping) в физическом движке Ammo.js предназначен для оптимизации производительности симуляции. Объекты, которые долго остаются в состоянии покоя, перестают участвовать в расчетах динамики, снижая нагрузку на процессор. Управление этим режимом основано на энергии тела и времени его бездействия.


Порог активации спящего режима

Каждое тело в Ammo.js имеет параметр activationState и связанные с ним энергетические пороги:

  • setActivationState() — устанавливает состояние тела, например, ACTIVE_TAG, ISLAND_SLEEPING, WANTS_DEACTIVATION.
  • setSleepingThresholds(linear, angular) — задает пороги линейной и угловой скорости для перехода тела в спящий режим.
body.setSleepingThresholds(0.1, 0.1);

Здесь 0.1 — минимальная линейная и угловая скорость, при которых тело может считаться неподвижным. Если скорость тела опускается ниже этих значений на протяжении определенного времени, Ammo.js автоматически переводит объект в спящий режим.

Ключевой момент: Порог должен быть достаточным для предотвращения «дрожания» объектов при малых колебаниях из-за численных ошибок, но не слишком высоким, чтобы тело не «усыпало» при незначительном движении.


Время бездействия и деактивация

Ammo.js использует параметр deactivationTime — продолжительность бездействия перед переходом тела в спящий режим. По умолчанию он равен 2.0 секундам, но может быть изменен через настройку setDeactivationTime().

body.setDeactivationTime(1.5); // тело уснет через 1.5 секунды без движения

Тело переводится в состояние ISLAND_SLEEPING, если выполняются одновременно следующие условия:

  1. Линейная скорость < порога линейной скорости.
  2. Угловая скорость < порога угловой скорости.
  3. Время бездействия > deactivationTime.

Это обеспечивает баланс между стабильностью симуляции и производительностью.


Принудительное пробуждение объектов

Иногда требуется разбудить тело вне зависимости от его текущего состояния. Для этого используется метод:

body.activate(); // переводит тело в ACTIVE_TAG

Особенности активации:

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

Влияние на производительность

Использование спящего режима значительно снижает нагрузку на CPU в сценах с большим количеством объектов. Особенно заметно при физике разрушений, кучах предметов или симуляциях с мелкими деталями. Правильная настройка порогов позволяет:

  • Избежать лишних вычислений для неподвижных объектов.
  • Сократить количество коллизий и расчета импульсов.
  • Поддерживать стабильную частоту кадров без заметного влияния на точность симуляции.

Настройка порогов для сложных объектов

Для сложных или нестабильных тел рекомендуется индивидуальная настройка порогов:

body.setSleepingThresholds(0.05, 0.05); // чувствительное тело
body.setDeactivationTime(0.8);          // быстрее уходит в спящий режим
  • Низкие пороги позволяют телам быстрее засыпать, но увеличивают риск непреднамеренного «дрожания» из-за численных ошибок.
  • Высокие пороги сохраняют тело активным даже при малых колебаниях, что необходимо для объектов с мелкими анимациями или при взаимодействии с игроком.

Взаимодействие спящих и активных объектов

Ammo.js автоматически пробуждает спящие тела при столкновении с активными объектами. Алгоритм работает так:

  1. Детектируется коллизия между активным и спящим телом.
  2. Спящее тело переводится в состояние ACTIVE_TAG.
  3. Связанные constraints и соединения также активируются.

Это предотвращает «залипание» объектов и обеспечивает корректное взаимодействие динамических элементов сцены.


Практические рекомендации

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

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