Оптимизация физики
Расчет физических взаимодействий может быть очень сложным. Существуют методы оптимизации, обеспечивающие высокую производительность и общую стабильность ваших интерактивных проектов.
Общие настройки#
Поддерживайте глобальные настройки физики на разумном уровне.
-
Укажите расстояние от камеры, от которого не рассчитываются физические взаимодействия. Если расстояние между камерой и физическим узлом превышает этот предел, узел «застывает» и его физические вычисления пропускаются до тех пор, пока узел не приблизится к камере.
Имитация ткани останавливается, начиная с указанного расстояния от камеры
- Использование параметра Iterations может повысить стабильность, но также может привести к увеличению нагрузки. Большое количество итераций может привести к заметным задержкам, так как очень трудоемкие вычисления автоматически пропускаются. Для простых сцен вполне достаточно одной итерации физики.
- Настройте бюджет времени для симуляции физики.
Оптимизация обнаружения столкновений#
Фильтрация взаимодействий#
Очень маловероятно, что каждый физический объект в вашем проекте будет взаимодействовать со всеми другими объектами. Скорее всего, объекты можно разделить на группы, посвященные определенным задачам.
Если у вас есть несколько объектов, которые участвуют в физическом моделировании, разделите те, которые вряд ли будут взаимодействовать друг с другом, на разные «группы» с помощью механизма Bit Masking .
Ограничение столкновений#
Установите соответствующие маски Collision для тех конкретных коллизионных форм (shapes), поверхностей (surface) и тел (body), которые, как ожидается, будут сталкиваться. Если маски не совпадают, фигуры и тела просто игнорируют друг друга, проходя сквозь них.
Столкновения рассчитываются для плоскости и сферы, а прямоугольник игнорируется из-за несоответствия масок Collision
|
Маска Collision физической формы сферы
|
Маска Collision физической формы коробки
|
Маска Collision поверхности плоскости
|
Маска Collision поверхности земли
|
В Unigine вы можете точно настроить фильтрацию с помощью маски исключения . Эта маска позволяет игнорировать фигуры с соответствующими масками исключения независимо от их масок столкновений .
Поверхности, которые не предназначены для физического взаимодействия, должны иметь отключенный флаг Collision. Например, приборная панель внутри кабины никогда не будет участвовать в обнаружении столкновений снаружи.
Предотвращение обнаружения нежелательных и ненужных столкновений - основной способ уменьшить количество физических вычислений.
Фильтрация физических эффектов#
Укажите определенные физические узлы , которые должны влиять только на соответствующие тела, используя Physical Masks так же, как и для столкновений. На изображении ниже объект Physical Wind влияет на флаг, но не на сферу.
Физический ветер действует на ткань, но не на сферу |
Physical маска тканевого баннера
|
Physical маска сферы
|
Physical-маска объекта Physical Wind
|
Маска пересечения#
Пересечение - это общая точка указанной области (или линии) и объекта. Нахождение пересечения между лучом и поверхностью выполняется быстро, поэтому иногда может использоваться вместо обнаружения столкновения. Например, расчет коллизий автомобильных колес с землей можно упростить, используя пересечения.
Хотя это только программный подход, он требует установки Intersection Masks для целей фильтрации.
И физические формы , и поверхности имеют маски пересечения.
Упрощение геометрии коллайдеров#
Как правило, большинство 3D-объектов должны быть представлены сложной и подробной видимой сеткой и невидимой упрощенной формой, используемой физическим движком для обнаружения столкновений ( коллайдер ).
Детализированная видимая сетка
|
Невидимое физическое представление с использованием упрощенных форм
|
Использование более простых фигур#
Физические формы , состоящие из простых примитивов, упрощают расчеты столкновений, сохраняя при этом высокую производительность и приемлемую точность. Поэтому рекомендуется аппроксимировать геометрию простыми примитивами ( Sphere , Capsule , Cylinder , Box ), которые работают быстрее и требуют меньше памяти.
Сложные формы, такие как Convex Hull и набор автоматически сгенерированных выпуклых корпусов , должны быть выбраны для представления сложной и составной геометрии, когда простые формы не позволяют достичь желаемые цели.
В то же время вы должны сохранять количество коллизионных форм как можно ниже , чтобы избежать тяжелых вычислений, ведущих к падению производительности. Помните, что фигура не должна дублировать сетку, которую она приближает. Хотя примитивы неточны, в большинстве случаев они дают приемлемые результаты.
Использование более простой геометрии#
Более простая геометрия используется для обнаружения столкновений поверхностей , тем выше будет производительность.
Если сетка, представляющая физическое препятствие, имеет несколько уровней детализации (LOD), наименее подробный из них является наиболее предпочтительным для обнаружения столкновений и пересечений. Включите параметры Collision и Intersection для этого LOD и отключите их для других.
Аппроксимация форм столкновений с помощью примитивов также является хорошей практикой. Вы можете применить следующий подход:
-
Убедитесь, что исходный узел не является коллайдером - убедитесь, что флаг Collision отключен для его поверхностей, тел и форм. Поскольку теперь это не учитывается при обнаружении столкновений.
-
Добавьте в сцену цилиндрический объект, выбрав Create -> Primitive -> Cylinder в строке меню, и закройте исходную сетку примитивом.
- Убедитесь, что опция поверхности Collision включена для примитива.
-
Скрыть визуальное представление поверхности примитива. Вы можете сделать это либо очистив его маски Viewport и Shadow, либо просто установив его параметр Max Visibility на отрицательную бесконечность (-inf) - это гарантирует, что поверхность не будет видна на любом расстоянии.
Теперь детальная сетка обеспечивает только визуальное представление, в то время как физические взаимодействия рассчитываются для примитивного цилиндра.
Подход к обнаружению столкновений#
Непрерывное обнаружение столкновений - достаточно дорогостоящая операция, поэтому рекомендуется использовать этот подход только для быстро движущихся объектов и объектов, требующих точных вычислений.
В большинстве случаев дискретного обнаружения столкновений будет достаточно. Для этого выберите фигуру и снимите для нее флажок Continuous.
Оптимизация физических тел#
Застывание#
Рекомендуется включить Freezing для всех тел типа Rigid, Ragdoll и Fracture. Это позволяет сэкономить много вычислительных ресурсов, пропуская физические вычисления неподвижных объектов до тех пор, пока на них не воздействует какая-либо сила или объект.
Чтобы включить застывание, выполните следующие действия:
- Включите флаг Freezable для всех типов физических тел, перечисленных выше.
- Установите соответствующие значенияFrozen Linear Velocityа такжеFrozen Angular Velocityпараметры для каждого физического тела или настройте глобальные параметры . Эти глобальные пороговые значения застывания сравниваются с порогами, установленными для каждого тела, и выбирается максимальное значение для застывания тела.
- Отрегулируйте количество Frozen Frames. Чем ниже значение, тем быстрее объекты застывают.
Разрушаемые тела#
Не смотря на то, что разрушаемое тело (fracture) является относительно недорогим в плане вычислений, в случае большого количества обломков его влияние на производительность может стать значительным. Чтобы избежать падения производительности, можно воспользоваться следующими советами:
- Используйте параметр Volume Threshold, чтобы уменьшить количество обломков.
- Уберите обломки сломанного тела со сцены.
Пример на основе кода, иллюстрирующий, как удалить (со временем исчезнуть) фрагменты трещин со сцены, можно найти в разделе Physics примеров UnigineScript .