Ускоряем ваш Unity проект. ECS для MonoBehavior разработчиков

Ускоряем ваш Unity проект. ECS для MonoBehavior разработчиков

Твой программист

На обложке демо-игра Megacity. Она содержит 4,5 млн элементов Mesh Renderer, 5000 динамических транспортных средств, 200 000 уникальных строительных объектов и 100 000 уникальных аудиоисточников. Но самое удивительное, что вся эта мощь запустилась на Iphone X при 60 кадрах в секунду . Как все это возможно?

Пару лет назад компания Unity представила свой стек  DOTS, на котором и построен проект Megacity. Это некий список технологий, которые в совокупности позволяют колдовать и ускорять ваш проект в десятки раз. В корне всей магии лежат 2 простых заклинания:

  • Если правильно управлять данными, процессору будет легче их обрабатывать, а если их легче будет обрабатывать, то игрокам будет легче жить.
  • Количество ядер процессора растет, но код среднестатистического программиста не использует все ядра процессора. А значит игрокам все же живется туго. Фреймрейт ведет себя как Джокер - непредсказуемо.

Для того, чтобы юным Unity волшебникам удалось осуществить вышеописанные постулаты, компания выпустила дополнительные пакеты:

Дары смерти от Unity Technologies

А сердцем DOTS является:

  • Entities - архитектурный паттерн Entity Component System (ECS), который ставит во главу угла данные, а не объекты, и тем самым переворачивает привычное представление о программировании среди ценителей ООП . Подобный подход развивает идею композиции над наследованием и позволяет легко адаптироваться под динамичные потребности гейм-дизайнера.

  • ECS стоит рассматривать в первую очередь как архитектурное решение. Скорость - это бонус.

На текущий момент DOTS выглядит скорее проклятьем Unity Technologies, чем волшебной палочкой. Стек до сих пор не вышел в официальный релиз. И неизвестно когда Хогвартс распахнет свои двери для новых волшебников. Сейчас это крайне нестабильная штука, которую точно не стоит использовать в Production проекте.

Поэтому, давайте начнем колдовать вне Хогвартса.

Производительность! Бесплатно и без регистрации

Entity Component System - это сердце нового подхода от Unity. Но одновременно и самая нестабильная часть всего стека DOTS . Давайте попробуем применить эту технологию самим, без пакета от Unity Technologies.


Из чего состоит ECS?

Если перенести аналогию на игровые объекты, то ваш персонаж в игре - это Entity. Компонент физики - Rigidbody, а система - это то, что будет управлять всей физикой на сцене, включая вашего персонажа в игре.

Согласно официальной статье , снижение количества Update функций и переход на чистый c# автоматически добавит скорости в вашу игру. А Job System, Burst Compiler можно применять к любой архитектуре. И если у команды Unity пакет Entities пока что официально не выпущен, давайте обратимся к кулинарным профессионалам из сообщества и посмотрим, как же они предлагают нам приготовить этот самым ECS.

Рецепт ECS под соусом Leo

Поиск Гугл по рецептам приводит нас к самому вкусному результату:

Leo ECS - очень легкий и быстрый ECS фреймворк, который не требует какого-то специфичного игрового движка. Он прост, быстр и не форсирует вашу интеграцию с Unity Engine.

Другие ECS рецепты, которые могут вас заинтересовать

Вот мы и определились. Чистый C# и соус Leo. Что может быть круче?

Превращаем GameObject в Entity

Если Leo ECS по умолчанию не конвертирует игровые объекты из Unity Engine, то как интегрировать его с этим движком? Можно ли как-нибудь очень-очень легко превращать наши игровые объекты в Entity, чтобы процесс готовки был простым и понятным.

В этом нам поможет моя собственная библиотека UniLeo . Я написал ее для того, чтобы сохранить привычный flow работы с игровым движком Unity.

UniLeo автоматически конвертирует ваши игровые объекты в Entity и позволяет настраивать компоненты прямо из инспектора.

Перейдем наконец-то к коду

Подключаем пакеты через Unity Package Manager

Компонент в Leo ECS - это обычная структура, но мы, благодаря UniLeo можем управлять ее содержимым в рамках редактора Unity.

Не забываем пространство имен

Создаем первый компонент

Пример компонента с элементами Unity

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

Теперь нам необходимо как-нибудь прикрепить наш компонент к игровому объекту, но как это сделать? Компоненты - это структуры. А движок Unity позволяет крепить к игровым объектам только классы, которые наследуется от MonoBehavior .

Но в UniLeo можно создать класс-проводник, который должен наследоваться MonoProvider и его можно крепить к игровым объектам.

Создаем класс-проводник

После того, как данный класс закреплен на игровом объекте, его можно предварительно настроить из редактора.

Отлично, теперь мы можем без лишних проблем настроить наш компонент прямо из редактора Unity.

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

IEcsInitSystem // Срабатывает 1 раз при инициализации

IEcsRunSystem // Срабтаывает на Update или Fixed Update метод

Пишем первую систему

Когда наша первая система создана, мы должны как-то запустить ее: для этого создадим стартап код ECS, это простой класс, который наследуется от MonoBehavior .

Запускаем ECS

Обратите внимание, что к вашему игровому объекты автоматически добавится компонент Convert To Entity , который позволяет выбрать предпочтительный метод конвертации ваших игровых объектов.

Выбираем метод конвертации

После запуска игровой объект автоматически сконвертируется в Entity. Система начнет отрабатывать свои методы. Мы успешно интегрировали Leo ECS в наш проект. Поздравляю!

Наверное у вас еще остались вопросы, я попробую ответить на них.

Вопрос-Ответ

Как работать с Prefab?

Как работать с ивентами в ECS?

А что насчет многопоточности?

Я пишу сетевую игру, как мне работать с ECS

P.S

Да, возможно сторонние ECS решения не такие быстрые, как подход DOTS, но они позволяют существенно увеличить производительность относительно классического MonoBehavior подхода. Теперь вы знаете с чего начать свой Megacity проект!


Report Page