Оптимизируем физику в Unity: рейкастинг | OTUS

Оптимизируем физику в Unity: рейкастинг

otus_Posts_25may_VK_1000x700_3-20219-cf4b8f.jpg

Рейкастинг — полезный и довольно мощный инструмент в физическом движке. Он даёт возможность направлять луч какой-нибудь длины в определённом направлении, получая информацию о произошедших столкновениях. Производительность рейкастинга зависит от типов коллайдеров на сцене и длины луча.

Предлагаем вам ряд советов по применению рейкастинга: — очевидно, но факт: стремитесь к наименьшему числу лучей; — не стоит делать лучи длиннее, чем это действительно надо, ведь чем длиннее будет луч, тем больше объектов придётся проверять на столкновение; — не стоит применять рейкасты внутри метода FixedUpdate(). Мало того, иногда бывает излишним даже применение их внутри метода Update(); — обращайте внимание на типы используемых коллайдеров. Например, рейкастинг с меш-коллайдером обойдётся достаточно дорого. При этом неплохим решением станет создание дочернего объекта с примитивными коллайдерами и повторение с их помощью приблизительной формы меша. Ведь все дочерние коллайдеры у родительского Rigidbody будут вести себя, как составные коллайдеры. Если же вам очень надо использовать именно меш-коллайдеры, то сделайте их хотя бы выпуклыми; — уточняйте, во что конкретно должен попадать луч и, если это возможно, конкретизируйте слой-маску в функции рейкаста; — не забывайте, что данные, которые указываются вами в функции рейкаста, являются не идентификатором слоя, а битовой маской. Если желаете, чтобы луч сталкивался с объектом, находящимся на слое с идентификатором 10, указывайте битовый сдвиг влево на 10 (1<<10), а не просто 10. Если желаете, чтобы луч врезался во всё, кроме объектов на слое 10, используйте побитовый оператор дополнения (~) — он инвертирует каждый бит в побитовой маске.

Как это выглядит на практике

Теперь рассмотрим простую демо-сцену, в которой объект стреляет лучами, которые сталкиваются лишь с зелёными объектами.

Простая демо-сцена с рейкастами:

physicsbestpractices04_1-20219-8dfbb8.jpg

Здесь, чтобы получить данные профилировки, ведётся управление числом и длиной лучей. Давайте посмотрим на них на графике, где представлена зависимость производительности от числа лучей:

physicsbestpractices05_1_1-20219-9f41a7.jpg

А теперь посмотрим на зависимость производительности от длины лучей:

physicsbestpractices06_1-20219-04940f.jpg

А теперь посмотрим, что произойдёт, если мы поменяем примитивные коллайдеры на меш-коллайдеры. Меш-коллайдеры на сцене (110 полигонов на коллайдер):

physicsbestpractices07_1-20219-566b3e.jpg

Примитивные коллайдеры по сравнению с меш-коллайдерами в данных профилировки:

physicsbestpractices08_1-20219-67620e.jpg

Как вы видите на данных профилировки, рейкастинг меш-коллайдеров заставляет физический движок работать больше.

По материалам статьи «Physics Best Practices»

Также возможно вам будет интересно: — «Оптимизируем физику в Unity: слои и матрица коллизий».

Не пропустите новые полезные статьи!

Спасибо за подписку!

Мы отправили вам письмо для подтверждения вашего email.
С уважением, OTUS!

Автор
0 комментариев
Для комментирования необходимо авторизоваться
Популярное
Сегодня тут пусто