Высокопроизводительная физика в Unity 5

ANTHONY YAKOVLEV / UNITY TECHNOLOGIESContributor
Jul 8, 2014|8 Мин
Высокопроизводительная физика в Unity 5
Эта веб-страница была переведена с помощью машинного перевода для вашего удобства. Мы не можем гарантировать точность или надежность переведенного контента. Если у вас есть вопросы о точности переведенного контента, обращайтесь к официальной английской версии веб-страницы.
Мы хотели бы рассказать о некоторых изменениях в 3D-физике, которые вы можете ожидать в Unity 5.0.

Мы используем PhysX 2.8.3 уже некоторое время. Мы не просто использовали обычный PhysX, но и расширили его многочисленными патчами, сделанными инженерами Unity за многие годы. Прошло так много времени, и мы говорим спасибо PhysX 2 за всю рыбу. Как было объявлено на GDC'14, Unity 5.0 содержит обновление PhysX 3.3. Давайте рассмотрим его поближе.

PhysX SDK 3 - это радикальная переработка старого доброго PhysX SDK 2.x. По сути, команда PhysX взяла лучшие идеи и лучшие подходы из 2.x и переписала весь SDK с нуля. Это означает, что вся кодовая база отличается, все интерфейсы разные и большая часть функциональности тоже.

А теперь давайте посмотрим, каково это - использовать физику Unity 5.0.

Чтобы начать с простого, мы сделали адаптивную силу переключаемой и выключенной по умолчанию. Адаптивная сила - это специальная техника в PhysX, позволяющая компенсировать численные ошибки при моделировании стеков. Однако отзывы разработчиков Unity говорят о том, что адаптивная сила вносит большой вклад в общую нестабильность игрового контента. Ожидайте, что в будущем ваши вещи, похожие на стек, будут вести себя лучше.

Перемещение статических коллайдеров

Перемещение статических коллайдеров станет гораздо менее затратным. Статический коллайдер - это просто игровой объект с компонентом коллайдера на нем, но без компонента Rigidbody. Ранее, поскольку SDK предполагал, что статические коллайдеры не перемещаются, перемещение статического коллайдера вызывало дорогостоящую перестройку дерева AABB, что сильно сказывалось на общей производительности.

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

Обнаружение столкновений

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

В Unity 5.0 SDK генерирует все данные, необходимые для обработки быстрого движения. Вы просто включаете непрерывное обнаружение столкновений, и все работает. В PhysX3 есть алгоритм, который определяет, действительно ли необходима дорогостоящая симуляция CCD с учетом текущей скорости тела, или же вполне достаточно дискретной симуляции по умолчанию. Он активируется, как только вы включаете ПЗС.

бильярдный стол
Жесткие тела на широкой фазе

PhysX3 поддерживает больше жестких тел на широкой фазе. На самом деле, на настольных и похожих на настольные платформах на одном кадре может быть несколько сотен тысяч тел. Ранее для тел существовало фиксированное ограничение в 64 кб. Это не было константой, которую мы могли бы легко увеличить - это было следствием значительной экономии на битах по всему SDK. Некоторые консоли, такие как PlayStation 3, по-прежнему имеют это ограничение. Также существует ограничение на физические материалы: на момент написания статьи у вас не может быть более 64k материалов на любой платформе.

Масштабирование сетчатых коллайдеров бесплатно (более или менее)

В Unity 5.0 мы уменьшили стоимость масштабирования Mesh Colliders. Раньше при масштабировании меш-коллайдера приходилось создавать новый меш с масштабом, заложенным в вершины, а это требовало много времени и памяти. В PhysX3 мы можем поддерживать неотрицательное масштабирование без всякого печения. По сути, это бесплатно.

Далее рассмотрим две подсистемы, которые настолько сильно отличаются от версии Unity 4.x, что их можно считать новыми: модули одежды и транспортных средств.

Тканевый компонент

Начнем с ткани. В Unity 4 моделирование ткани поддерживается с помощью компонентов InteractiveCloth и SkinnedCloth. InteractiveCloth имеет поведение сетки, похожее на ткань, т.е. "физическую ткань", которая взаимодействует с другими физическими телами, может прикладывать силы и т.д. InteractiveCloth требует больших вычислительных затрат, поэтому в Unity 4 есть еще один вариант, SkinnedCloth, для одежды персонажей.

Поскольку SkinnedCloth отделена от основного конвейера моделирования, она способна работать лучше, чем InteractiveCloth. Основная проблема с тканью заключается в том, что оба компонента были довольно нестабильными и стоили дорого. С появлением интеграции PhysX3 мы решили отказаться от поддержки InteractiveCloth и оставить только один компонент ткани, который называется просто Cloth и предназначен для одежды персонажей.

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

Таким образом, Cloth и мир не узнают и не видят друг друга, пока вы вручную не добавите коллайдеры из мира в компонент Cloth. Даже после этого моделирование остается односторонним: ткань реагирует на эти тела, но не прикладывает к ним обратную силу. Кроме того, вы можете использовать только три типа коллайдеров с тканью: сфера, капсула и конические коллайдеры, построенные с использованием двух коллайдеров-сфер. Все эти изменения были внесены для повышения производительности.

Авторский интерфейс в Unity 5.0 похож на интерфейс SkinnedCloth, и мы упорно работаем над его улучшением в версии 5.x. Ожидайте, что в цикле 5.x будут добавлены такие вещи, как интеграция с аватарами Mecanim.

Новый компонент Cloth поддерживает GPU через CUDA, но мы решили выпустить его позже в цикле 5.x по нескольким причинам. Во-первых, CUDA работает только под Windows на оборудовании NVIDIA, а мы широко представлены на Mac и Linux. Во-вторых, мы действительно хотим сосредоточить наши усилия по исправлению ошибок сначала на основных вещах, а уже потом переходить к интеграции причудливых вещей.

SDK для новых автомобилей

Теперь несколько слов о транспортных средствах. PhysX3 имеет новый блестящий SDK Vehicle, который мы использовали для реализации нашего компонента WheelCollider. Новый компонент обеспечивает гораздо более реалистичную подвеску и трение шин. Кроме того, он исправляет ряд других давних проблем.

В Unity 5.0 новый компонент можно использовать для создания простого поведения. Я ожидаю, что разработчики будут покупать пакеты транспортных средств в Asset Store только в том случае, если им нужно что-то уже доработанное, реалистичное или продвинутое, как , например, пакет Edy's Vehicle Package.

Посмотрите, что я смог создать за пару часов, используя бесплатную сетку, скачанную из Интернета (большая часть этого времени была потрачена в Blender на подготовку модели):

А вот один из внедорожников из пакета Edy's Vehicle Package:

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

Я хотел бы поделиться с вами множеством фантастических технических подробностей об автомобилях, но пока давайте просто посмотрим на новые штуковины WheelCollider. Это даст вам представление о том, как будет работать подвеска.

колесная штуковина

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

Как и следовало ожидать, колесо может перемещаться только между положениями максимального сжатия и максимального опускания. Целевое положение (в технических терминах также называемое положением покоя) находится именно там, где подрессоренный вес уравновешен силой пружины; то есть в том положении, в котором находится колесо, когда автомобиль просто стоит на ровной поверхности. Это может показаться сложным для настройки, но на самом деле максимальное положение сжатия - это то, где ваше колесо изначально расположено в сетке.

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

Производительность

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

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

Ниндзя производительности, заинтересованные в большем количестве данных, должны посетить блог Пьера Тердимана. Он является основным разработчиком PhysX SDK.

Совместимость

Новые функции выглядят и ощущаются как Unity, но все же есть случаи, когда поведение отличается, параметры означают разные вещи или, в некоторых случаях, старое поведение больше не поддерживается. Таким образом, физика Unity 5.0 не на 100% совместима с Unity 4.x. Будьте готовы к тому, что при переходе с предыдущих версий Unity вам придется перенастроить старые проекты и переписать часть кода физики.

О физике в Unity 5 можно рассказать гораздо больше, чем в этом посте. Пожалуйста, не стесняйтесь задавать вопросы в комментариях, а если вы посетите нашу конференцию разработчиков Unite 2014 в этом году, посмотрите мой подробный доклад о физике в Unity 5.0 и приходите поздороваться и пообщаться.

Подробнее о Unity 5