Спящий режим (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, если
выполняются одновременно следующие условия:
deactivationTime.Это обеспечивает баланс между стабильностью симуляции и производительностью.
Иногда требуется разбудить тело вне зависимости от его текущего состояния. Для этого используется метод:
body.activate(); // переводит тело в ACTIVE_TAG
Особенности активации:
Использование спящего режима значительно снижает нагрузку на CPU в сценах с большим количеством объектов. Особенно заметно при физике разрушений, кучах предметов или симуляциях с мелкими деталями. Правильная настройка порогов позволяет:
Для сложных или нестабильных тел рекомендуется индивидуальная настройка порогов:
body.setSleepingThresholds(0.05, 0.05); // чувствительное тело
body.setDeactivationTime(0.8); // быстрее уходит в спящий режим
Ammo.js автоматически пробуждает спящие тела при столкновении с активными объектами. Алгоритм работает так:
ACTIVE_TAG.Это предотвращает «залипание» объектов и обеспечивает корректное взаимодействие динамических элементов сцены.
activate() для принудительной активации
после внешнего воздействия или событий пользователя.deactivationTime для оптимального
баланса между производительностью и реалистичностью симуляции.Спящий режим в Ammo.js является ключевым инструментом оптимизации физики, позволяя управлять энергией объектов и временем их активности для достижения стабильной и производительной симуляции.