Оптимизируем физику в Unity: слои и матрица коллизий

Как правило, игровые объекты в Unity создают на слое Default. В результате всё со всем сталкивается, что не есть хорошо. Но разработчик может обозначить, что и с чем должно взаимодействовать. Для этого ему следует определить различные слои для различных типов объектов, добавляя для каждого нового слоя свою строку и свой столбец. За определение коллизий между слоями отвечает матрица коллизий.

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

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

Зелёные объекты должны взаимодействовать лишь сами с собой, а также со стенами (в нашем случае это слой Wall). При этом в первом тесте все объекты принадлежат слою Default, а столкновения между ними производятся посредством строкового сравнения тега игровых объектов на слушателе коллизий. Что касается второго теста, то в нём объекты разделены на 2 слоя. Взаимодействие слоёв настраивалось в матрице коллизий:

Теперь давайте посмотрим на изображения ниже, которые берутся непосредственно из демонстрации. В ней есть простейший менеджер, считывающий число столкновений каждые 5 секунд. Обратите внимание на число ненужных столкновений в варианте с общим слоем — оно действительно впечатляет.

Число столкновений в течение 5 секунд:

Теперь посмотрим на результат профилировки для получения более конкретных данных о нашем физическом движке. На картинке ниже общие слои сравниваются с отдельными слоями в данных профилировки:

Заметно, что есть различия по времени, которое затрачивает процессор на физику. На общем слое итоговое значение составляет около 27,7 мс, на отдельных слоях — ~17,6 мс. Как говорится, комментарии излишни.

Источник