Получение статистики через WorldInfo

Библиотека Oimo.js предназначена для физического моделирования в браузере на основе JavaScript, обеспечивая симуляцию твердых тел, столкновений и динамики объектов. Одной из ключевых возможностей является сбор статистики текущего состояния физического мира через объект WorldInfo. Этот объект предоставляет подробную информацию о численности объектов, состоянии симуляции и производительности, что важно для оптимизации и отладки сложных сцен.


Основные свойства WorldInfo

Объект WorldInfo доступен через свойство world.info, где world — это экземпляр класса OIMO.World. Ключевые свойства включают:

  • numRigidBodies — общее количество твердых тел в мире. Позволяет отслеживать динамику объектов и контролировать нагрузку на симуляцию.
  • numContacts — текущее число контактов между телами. Используется для оценки сложности столкновений и их влияния на производительность.
  • numJoints — количество соединений (joints) в сцене. Соединения включают шарниры, пружины, ограничители и другие механизмы, влияющие на физику.
  • stepTime — время последнего шага симуляции в миллисекундах. Данное значение отражает эффективность расчета физики за один цикл обновления.
  • elapsedTime — суммарное время работы мира с момента его создания. Полезно для измерения общего времени симуляции.

Пример доступа к этим свойствам:

let world = new OIMO.World({ timestep: 1/60, iterations: 8 });
console.log("Количество тел:", world.info.numRigidBodies);
console.log("Количество контактов:", world.info.numContacts);
console.log("Количество соединений:", world.info.numJoints);
console.log("Время последнего шага:", world.info.stepTime);

Методы обновления информации

Объект WorldInfo обновляется автоматически при каждом вызове метода world.step(). Это обеспечивает актуальность данных без необходимости ручного пересчета.

world.step();
console.log("Контакты после шага:", world.info.numContacts);
  • world.step() принимает один необязательный параметр — timeStep. Если параметр не задан, используется значение timestep, указанный при создании мира.
  • Важно учитывать, что WorldInfo отражает состояние после последнего шага, поэтому сбор статистики до вызова step() даст данные предыдущего цикла.

Практическое использование статистики

  1. Мониторинг производительности С помощью свойства stepTime можно определять нагрузку на CPU и корректировать параметры мира, такие как iterations и timestep.

  2. Оптимизация количества объектов Свойства numRigidBodies и numContacts позволяют отслеживать увеличение числа тел и столкновений, что важно для крупных сцен. Если количество контактов растет слишком быстро, можно пересмотреть физические параметры объектов или объединять мелкие тела.

  3. Диагностика соединений Использование numJoints помогает контролировать сложные механизмы, проверять корректность прикрепления объектов и предотвращать нестабильность сцены.


Расширенные возможности

WorldInfo предоставляет также внутренние свойства, не всегда документируемые официально, такие как:

  • numSleepingBodies — количество тел, находящихся в состоянии покоя (sleeping), что позволяет оптимизировать расчеты.
  • numActiveBodies — активные тела, участвующие в симуляции, отражающие текущую динамическую нагрузку.
  • gravity — сила гравитации, актуальная для текущего мира. Полезно для проверки, правильно ли установлена физическая среда.
console.log("Спящие тела:", world.info.numSleepingBodies);
console.log("Активные тела:", world.info.numActiveBodies);
console.log("Гравитация:", world.info.gravity);

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


Советы по работе со статистикой

  • Частый вызов console.log в цикле requestAnimationFrame может влиять на производительность. Рекомендуется собирать статистику раз в несколько шагов.
  • Использование numContacts как индикатора сложных столкновений помогает выявлять потенциальные проблемные зоны сцены.
  • Сравнение numActiveBodies и numSleepingBodies позволяет анализировать эффективность механизма сна и потенциально отключать ненужные вычисления.

WorldInfo является мощным инструментом для получения подробной информации о состоянии мира в Oimo.js, позволяя анализировать производительность, оптимизировать сцену и поддерживать стабильность физики даже в больших и сложных симуляциях.