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

Основы работы с физическими телами

В Ammo.js, как и в других физически ориентированных движках, каждое тело (rigid body) представляет собой отдельный объект с собственными параметрами массы, формы коллизии и физическими свойствами. При добавлении нового тела в мир создаётся соответствующая структура данных внутри движка, которая участвует в расчёте столкновений, интеграции движения и решении ограничений.

Каждое тело требует:

  • Выделения памяти для хранения позиции, скорости, ориентации и матриц трансформации.
  • Обновления коллизий, включая проверку пересечений с другими телами и расчет реакции.
  • Решения системы ограничений, если присутствуют соединения (joints) или контакты.

Рост числа тел увеличивает нагрузку на все эти компоненты, что напрямую влияет на производительность.

Стохастическая и детерминированная нагрузка

При небольшом количестве тел (до нескольких десятков) производительность обычно определяется временем интеграции движения и обработкой ограничений. При сотнях и тысячах тел основной узкий горлышко — это проверка коллизий.

Ammo.js использует btCollisionDispatcher и btDbvtBroadphase для управления коллизиями:

  • Broadphase выполняет грубую фильтрацию, определяя потенциально пересекающиеся пары.
  • Narrowphase проверяет каждую пару детально, рассчитывая контактные точки.

Количество пар растёт примерно пропорционально квадрату числа тел в худшем случае, но структуры вроде Dynamic Bounding Volume Tree (DBVT) помогают уменьшить количество проверок.

Масштабирование производительности

Производительность системы зависит от нескольких факторов:

  1. Форма коллизии:

    • Простые формы (сферы, кубы) обрабатываются быстрее.
    • Сложные формы (конвексные меши, триангуляционные сетки) требуют значительных вычислений.
  2. Количество динамических тел:

    • Динамические тела требуют полной физической симуляции.
    • Статические или кинематические тела участвуют только в проверке коллизий, снижая нагрузку.
  3. Шаг симуляции (time step):

    • Меньший шаг увеличивает точность, но требует больше итераций расчёта на один кадр.
    • Большой шаг может приводить к нестабильности при большом числе тел.
  4. Использование sleep-состояния:

    • Тела, которые долго не двигаются, могут быть переведены в состояние покоя.
    • Sleep-состояние уменьшает число активных тел в расчётах, снижая нагрузку на CPU.

Практические примеры оптимизации

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

Метрики производительности

Основные показатели влияния числа тел на производительность:

  • FPS симуляции: кадры физического мира в секунду. При росте числа тел FPS падает.
  • Количество контактных точек: с ростом числа тел контактные точки растут, увеличивая нагрузку на solver.
  • Время интеграции: увеличивается линейно с числом тел для позиции и скорости, но квадратично для проверки коллизий без оптимизаций.

Использование инструментов профилирования JavaScript, таких как Performance API или DevTools, позволяет определить узкие места и принять меры по оптимизации.

Особенности Ammo.js на больших сценах

Ammo.js — порт Bullet Physics на JavaScript с использованием WebAssembly, что обеспечивает высокую производительность по сравнению с чистым JS. Однако при увеличении числа тел:

  • Загрузка CPU растёт быстрее, чем GPU, так как расчёт физики в Ammo.js выполняется на процессоре.
  • Объём памяти увеличивается с ростом числа тел, что может приводить к сборке мусора и кратковременным тормозам.
  • Обработка столкновений остаётся главным ограничителем: даже при сотнях тел использование сложных коллизий ведёт к значительным потерям FPS.

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