Салют, хабровчане.
Как мы уже писали, январь богат новыми запусками и сегодня мы объявляем набор на новый курс от OTUS - «Разработчик игр на Unity» .
В преддверии старта курса делимся с вами переводом интересного материала.
Мы перестраиваем ядро Unity с помощью нашего стека технологий, ориентированных на данные ( Стек технологий, ориентированных на данные ).Far North Entertainment — шведская студия, совладельцами которой являются пять друзей-инженеров.Как и многие игровые студии, мы также видим большие преимущества в использовании системы Entity Component System (ECS), системы заданий C# и компилятора Burst. На Unite Copenhagen у нас была возможность пообщаться с Far North Entertainment и глубже изучить, как они реализуют эту функциональность DOTS в традиционных проектах Unity.
С момента выпуска Down to Dungeon для Gear VR в начале 2018 года компания работала над игрой, относящейся к классическому игровому жанру для ПК, а именно над постапокалиптической игрой на выживание среди зомби.
Что отличает проект от других, так это количество зомби, которые вас преследуют. По задумке команды, тысячи голодных зомби следовали за вами огромными ордами.
Однако на этапе прототипирования они быстро столкнулись с множеством проблем с производительностью.
Создание, смерть, обновление и анимация такого большого количества врагов оставалось основным узким местом даже после того, как команда попыталась решить проблему с помощью объединение объектов в пул и создание экземпляров анимации .
Это заставило технического директора студии Андреса Эрикссона обратить внимание на DOTS и изменить свое мышление с объектно-ориентированного на ориентированное на данные.
«Ключевая идея, которая помогла осуществить этот сдвиг, заключалась в том, чтобы перестать думать об объектах и иерархиях объектов и начать думать о данных, о том, как они преобразуются и как получить к ним доступ», — сказал он.
Его слова означают, что нет необходимости строить архитектуру кода с прицелом на реальные объекты, чтобы она решала самую общую и абстрактную задачу.
У него есть много советов для тех, кто, как и он, столкнулся с изменением мировоззрения: «Спросите себя, в чем заключается реальная проблема, которую вы пытаетесь решить, и какие данные важны для поиска решения.
Будете ли вы снова и снова преобразовывать один и тот же набор данных одним и тем же способом? Сколько полезных данных можно уместить в одну строку кэша процессора? Если вы вносите изменения в существующий код, подумайте, сколько ненужных данных вы добавляете в строку кэша.
Можно ли разделить вычисления на несколько потоков или мне следует использовать один поток командЭ» Команда пришла к пониманию того, что сущности в системе компонентов Unity — это просто идентификаторы поиска в потоках компонентов.
Компоненты — это просто данные, тогда как системы содержат всю логику и отфильтровывают сущности с определенной сигнатурой, известной как архетипы.
«Я думаю, что одним из идей, которые помогли нам визуализировать наше видение, было представление об ECS как о базе данных SQL. Каждый архетип представляет собой таблицу, в которой каждый столбец является компонентом, а каждая строка — уникальной сущностью.
По сути, вы используете системы для создания запросов к этим таблицам архетипов и выполнения операций над сущностями», — говорит Андерс.
Введение в ДОТС
Чтобы прийти к этому пониманию, он изучил документацию системы.Компонент сущности , Примеры ЭКС И пример , который мы сделали вместе с Nordeus и представили на Unite Austin. Общий материал по архитектуре, ориентированной на данные, также оказался очень полезным для команды.
" отчет Майка Конференция CppCon 2014, посвященная дата-ориентированной архитектуре, впервые открыла нам глаза на этот способ программирования».
Команда Крайнего Севера опубликовала то, что узнала, в своем Блог разработчиков , они приехали в Копенгаген в сентябре этого года, чтобы рассказать о своем опыте перехода к подходу, ориентированному на данные, в Unity. Эта статья основана на докладе и более подробно объясняет особенности реализации ECS, C# Task System и компилятора Burst. Команда Крайнего Севера также любезно поделилась большим количеством примеров кода из своего проекта.
Организация данных зомби
«Проблема, с которой мы столкнулись, заключалась в выполнении интерполяции перевода и вращения тысяч объектов на стороне клиента», — говорит Андерс.Их первоначальный объектно-ориентированный подход заключался в создании абстрактного сценария.
ЗомбиView , который наследует общий родительский класс EntityView .
EntityView - Этот МоноПоведение , прикрепленный к Игровой объект .
Он действует как визуальное представление игровой модели.
Каждый ЗомбиView отвечал за обработку собственного перевода и интерполяции вращения в своей функции Обновлять .
Это звучит нормально, пока вы не поймете, что каждая сущность расположена в случайном месте памяти.
Это означает, что если вы обращаетесь к тысячам объектов, ЦП должен извлекать их из памяти по одному, а это очень медленно.
Если вы поместите данные в аккуратные блоки, расположенные последовательно, процессор сможет кэшировать целую кучу данных одновременно.
Большинство современных процессоров могут извлечь из кэша около 128 или 256 бит за цикл.
Команда решила перевести врагов на DOTS в надежде устранить проблемы с производительностью на стороне клиента.
Первой на очереди была функция Обновлять В ЗомбиView .
Команда определила, какие его части следует разделить на разные системы, и определила необходимые данные.
Первым и самым очевидным моментом стала интерполяция позиций и вращений, поскольку игровой мир представляет собой 2D-сетку.
Два поплавка отвечают за то, куда движется зомби, а последний компонент — целевая позиция, он отслеживает позицию сервера для противника.
Следующим шагом было создание архетипа врагов.[Serializable] public struct PositionData2D : IComponentData { public float2 Position; } [Serializable] public struct HeadingData2D : IComponentData { public float2 Heading; } [Serializable] public struct TargetPositionData : IComponentData { public float2 TargetPosition; }
Архетип — это набор компонентов, принадлежащих определенной сущности; другими словами, это сигнатура компонента.
В проекте используются префабы для определения архетипов, поскольку врагам требуется больше компонентов, а некоторым из них нужны ссылки на Игровой объект .
Это работает так: вы можете обернуть данные вашего компонента в КомпонентДанныеПрокси который превратит его в МоноПоведение , который, в свою очередь, можно прикрепить к префабу.
Когда вы создаете экземпляр, используя EntityManager и передать префаб, он создает объект со всеми данными компонента, которые были прикреплены к префабу.
Все данные компонентов хранятся в блоках памяти размером 16 КБ, называемых АрхетипЧанк .
Вот визуализация того, как будут организованы потоки компонентов в нашем фрагменте архетипа:
«Одним из главных преимуществ архетипических чанков является то, что вам не нужно часто перераспределять кучу при создании новых объектов, поскольку память уже выделена заранее.
Это означает, что создание сущности включает запись данных в конец потоков компонентов внутри фрагментов архетипа.
Единственный раз, когда вам нужно снова выполнить выделение кучи, — это создание объекта, который не умещается в границах чанка.
В этом случае либо будет выделен новый чанк архетипа размером 16 КБ, либо, если есть пустой чанк того же архетипа, его можно будет использовать повторно.
Данные для новых объектов затем будут записаны в потоки компонентов нового фрагмента».
, - объясняет Андерс.
Многопоточность ваших зомби
Теперь, когда данные были плотно упакованы и помещены в память с возможностью кэширования, команда могла легко использовать систему задач C# для параллельного выполнения своего кода на нескольких ядрах ЦП.Следующим шагом было создание системы, которая отфильтровывала все сущности из всех блоков архетипов, которые имели компоненты ПозицияДанные2D , ЗаголовокДанные2D И TargetPositionData .
Для этой цели Андерс и его команда создали JobComponentСистема и построил ваш запрос в функции При создании .
Это выглядит примерно так: private EntityQuery m_Group;
protected override void OnCreate()
{
Теги: #Разработка игр #unity #dots
-
Как Получить Срочную Помощь По Uc Browser
19 Oct, 24 -
Нюансы При Работе С Миграциями Ef
19 Oct, 24 -
Фотография Еды На Iphone X
19 Oct, 24 -
Mysql => Udf?
19 Oct, 24