Рекомендации по выбору форм для производительности

В Oimo.js производительность симуляции физики сильно зависит от выбора форм (shapes) для тел (bodies). Библиотека оптимизирована под определённые типы примитивов, и правильный выбор формы позволяет уменьшить вычислительную нагрузку и повысить стабильность симуляции.


Примитивы и их влияние на производительность

Oimo.js поддерживает несколько основных примитивов:

  • Box – куб или прямоугольный параллелепипед.
  • Sphere – сфера.
  • Cylinder – цилиндр.
  • Capsule – капсула (цилиндр с полусферами на концах).
  • Convex Mesh – произвольная выпуклая форма.
  • Triangle Mesh – произвольная треугольная сетка для статических объектов.

Ключевой принцип: чем проще форма, тем быстрее расчёты столкновений. Box и Sphere обеспечивают максимальную производительность, Cylinder и Capsule чуть медленнее, а Convex Mesh и Triangle Mesh значительно более ресурсоёмкие.


Box и Sphere

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

Рекомендации по использованию:

  • Для объектов с прямыми краями всегда использовать Box, даже если модель визуально немного отличается.
  • Для сферических объектов или роликов, мячей и пуль – Sphere.

Cylinder и Capsule

  • Cylinder и Capsule имеют более сложные алгоритмы расчёта столкновений, чем Box и Sphere, из-за кривизны боковых поверхностей.
  • Capsule особенно удобна для персонажей и объектов, которые должны скользить по поверхностям без застреваний.

Рекомендации:

  • Использовать Cylinder и Capsule только там, где их форма критична для точности физики.
  • Для экономии ресурсов заменить Capsule на комбинацию Box + Sphere, если высокая точность не требуется.

Convex Mesh

  • Convex Mesh позволяет создавать сложные объёмы, но проверка столкновений с ними требует расчёта всех граней и рёбер.
  • Вычислительная нагрузка растёт с числом вершин и граней.

Оптимизация:

  • Уменьшать количество вершин до минимально необходимого.
  • Использовать Convex Mesh только для крупных объектов или объектов, которые редко взаимодействуют с другими динамическими телами.

Triangle Mesh

  • Triangle Mesh используется для статических сцен, например, для земли, стен и зданий.
  • Полностью динамическая Triangle Mesh крайне ресурсоёмкая и не рекомендуется.

Советы по производительности:

  • Делить сцену на несколько простых треугольных мешей вместо одной сложной.
  • Использовать Triangle Mesh только для статических объектов (тип static).

Общие рекомендации

  1. Минимизировать количество сложных форм. Каждое Convex или Triangle Mesh тело замедляет симуляцию.
  2. Комбинировать простые примитивы. Сложные объёмы можно приближённо моделировать с помощью нескольких Box и Sphere.
  3. Использовать LOD (Level of Detail). Для объектов, находящихся далеко от камеры, можно заменить сложные формы на простые.
  4. Статические объекты делать статичными. Triangle Mesh и Convex Mesh для статических тел не требуют пересчёта столкновений динамически.
  5. Собирать физику вокруг центров масс. Примитивы с корректным расположением центра массы обеспечивают более стабильные расчёты.

Параметры тела, влияющие на производительность

  • mass – масса тела влияет на расчёт динамики, но не на проверку столкновений.
  • friction и restitution – коэффициенты трения и упругости незначительно увеличивают вычислительную нагрузку.
  • sleeping – включение автоматического “засыпания” объектов уменьшает число расчётов для неподвижных тел.

Практическая стратегия выбора форм

  • Малые динамические объекты: Sphere или Box.
  • Средние и крупные динамические объекты: Box с возможной комбинацией Sphere/Capsule для сложных краёв.
  • Статические элементы сцены: Triangle Mesh или Convex Mesh, статичные, с низким количеством вершин.
  • Персонажи и скользящие объекты: Capsule с минимально необходимой детализацией.

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