Круглый стол по дизайну, ориентированному на данные: Ваши вопросы, ответы

FERGUS BAIRD / UNITY TECHNOLOGIESSenior Content Marketing Manager
Feb 28, 2024|9 Мин
Круглый стол по дизайну, ориентированному на данные: Ваши вопросы, ответы
Эта веб-страница была переведена с помощью машинного перевода для вашего удобства. Мы не можем гарантировать точность или надежность переведенного контента. Если у вас есть вопросы о точности переведенного контента, обращайтесь к официальной английской версии веб-страницы.

В декабре мы провели круглый стол для создателей DOTS с компанией Stunlock Studios (V Rising) и Sunblink Entertainment(HEROish, Hello Kitty Island Adventure). Мы пригласили этих первых последователей поделиться своим опытом использования стека технологий, ориентированных на данные (DOTS), показать, какие функции и возможности программирования, ориентированного на данные, открылись в их играх, и посмотреть, как они используют новейшую технологию Entity Component System (ECS) в Unity 2022 LTS.

Вопросы и ответы во время вебинара были в самом разгаре, вопросов от аудитории было так много, что мы не смогли ответить на все из них в прямом эфире. В продолжение темы мы попросили Джо Валенсуэлу, директора по разработке программного обеспечения в Unity, и Расмуса Хёка, технического директора Stunlock Studios, ответить на некоторые из наших любимых вопросов, прозвучавших на сессии. Ознакомьтесь с ними ниже, а вебинар по максимизации потенциала вашей игры с помощью дизайна, ориентированного на данные , можно заказать здесь.

V Rising от Stunlock Studios

"Лучше ли сразу начинать новые проекты с DOTS или с обычными GameObjects, а затем оптимизировать производительность, перейдя на ECS (чистый или гибридный)?"

ДЖО ВАЛЕНСУЭЛА: ECS, DOTS и дизайн, ориентированный на данные (DOD), - это не только повышение производительности. Это также позволяет избежать сложностей, присущих моделированию проблем с помощью объектно-ориентированного программирования (ООП).

Всем, кто собирается создать многопользовательскую игру - особенно с авторитетным сервером и предсказаниями на стороне клиента, - стоит серьезно задуматься о том, чтобы начать с DOTS. Netcode for Entities предлагает действительно надежную, мощную систему, которая масштабируется и позволяет писать простой код для геймплея.

Если вы не создаете многопользовательскую игру или просто создаете прототипы и хотите быстро опробовать новые возможности, вам стоит обратить внимание на MonoBehaviour/GameObjects.

"Можно ли создать игру полностью на системе DOTS, или DOTS поддерживает только систему GameObject?"

ДЖО ВАЛЕНСУЭЛА: Нет, в какой-то момент вам, вероятно, понадобятся объекты GameObjects. Мы над этим работаем.

"Какие есть недостатки или случаи, когда разработчику не следует использовать DOTS?"

ДЖО ВАЛЕНСУЭЛА: Возможно, вы спрашиваете не того человека - я не могу придумать случая, когда я бы предпочел использовать что-то другое, кроме DOTS в Unity! Но если уж вы выкрутили мне руки, то, пожалуй, я скажу, что традиционные проекты на основе MonoBehaviour/GameObject действительно очень хороши, когда вы занимаетесь прототипированием. Если вы ожидаете быстрых изменений, вам не обязательно тратить много времени на создание Bakers или разработку данных. В будущем мы надеемся упорядочить эту область для DOTS.

"Расмус, есть ли у вас совет по обучению инженеров программированию, ориентированному на данные?"

RASMUS HÖÖK: Я думаю, что хорошим началом будет просто написать настолько простой и понятный код, насколько это возможно, чтобы решить фактическую проблему, которая у вас есть. Как бы вживайтесь в образ мышления начинающего программиста и пишите очень ориентированный на результат код, где цель - заставить код делать то, что вы хотите. Первоначальная цель не должна заключаться в написании многократно используемого кода, создании абстракций или чего-то еще.

Приступая к работе с ECS, не стоит слишком задумываться или слишком усердствовать. Лучше сначала использовать более крупные компоненты и большие системы, а не разбивать их на множество мелких частей. Так будет проще следить за кодом. Разделитесь позже, когда у вас появится причина. Мы определенно совершили эту ошибку в самом начале.

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

"Мы часто слышим о том, что DOTS используется для расширения масштаба и создания более амбициозных игр, но есть ли преимущества в уменьшении масштаба? Например, использовать DOTS в небольшом проекте, чтобы нацелиться на системы нижнего ценового сегмента?"

ДЖО ВАЛЕНСУЭЛА: Эффективная работа на маломощных системах повышает качество кода моделирования, который они могут выполнять. Это также снижает потребность в батареях для устройств, работающих от аккумуляторов, что увеличивает время работы и улучшает общее состояние системы.

V Rising от Stunlock Studios
V Rising от Stunlock Studios

"При переходе от SystemBase к ISystem как быть с вызовами управляемого кода?"

ДЖО ВАЛЕНСУЭЛА: Технически, чтобы использовать ISystem, не нужно избавляться от управляемого кода - управляемый код можно вызывать из ISystem. Его управляемые данные не могут храниться в ISystem напрямую - для этого я бы использовал управляемые данные компонентов.

Однако если вы задаетесь вопросом: "Как мне избавиться от вызовов управляемого кода в ISystem, чтобы использовать Burst и получить максимальную производительность?", то ответ... это зависит от ситуации.

Если вы используете контейнеры .NET, вы можете найти подходящую замену в com.unity.collections. Если вы взаимодействуете с управляемым API Unity, а неуправляемой альтернативы нет, иногда полезно разделить работу на фазы "получение данных" и "обработка", на последней из которых вы выполняете обработку на основе ISystem.

"Я читал в документации, что ECS не совместим с архитектурой с несколькими сценами. Так как же следует подходить к этому вопросу, используя ECS?"

ДЖО ВАЛЕНСУЭЛА: Ничто в ECS не препятствует аддитивной загрузке нескольких сцен Unity. Однако эти сцены не будут содержать никаких данных ECS, только объекты GameObjects с MonoBehaviours.

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

"Насколько сильно наличие гибридных монобехавиров/ДОТС влияет на детерминизм в проекте?"

ДЖО ВАЛЕНСУЭЛА: Детерминизм не является бинарным состоянием, и мы не гарантируем, что все детали выполнения будут идентичны в разных запусках. Как правило, гибридное взаимодействие иногда необходимо для таких деталей презентации, как системы частиц или аудио, где идеальное покадровое воспроизведение не требуется.

Для таких функций, как предиктивный геймплей, вам понадобится симулятор, работающий в ECS.

Как управлять сотнями систем? Все ли они работают постоянно и просто не выполняют логику, когда в запросе нет сущностей? Или вы контекстно активируете системы, основываясь на состоянии игры?

ДЖО ВАЛЕНСУЭЛА: Для удобства разработки мы сделали обновление систем по умолчанию. Разница в производительности невелика, но если у вас действительно сотни систем, вам может быть полезно заставить их скрыто обновляться, вызвав RequireForUpdate или используя атрибут RequireMatchingQueriesForUpdate.

Идиома в этом случае - добавить RequireForUpdate<Foo>() в соответствующую систему и использовать Foo IComponentData в сценах как своего рода флаг для включения обновления этих систем.

"Я понимаю, что DOTS улучшает производительность в плане обработки больших объемов данных во время выполнения, во время игрового процесса (особенно рендеринга, как я слышал). Однако я также слышал, что DOTS улучшает производительность производства, облегчая любой необходимый рефакторинг. Не могли бы вы немного рассказать о том, как DOTS помогает в рефакторинге?"

ДЖО ВАЛЕНСУЭЛА: С моей точки зрения, большая привлекательность DOTS, ECS и DoD в целом заключается в том, что они делают более наглядным и проверяемым состояние моделирования. Если вы когда-либо пытались добавить тесты для ООП-библиотеки, то, возможно, сталкивались с проблемой, когда для воспроизведения состояния, необходимого для вызова "простого" экземпляра метода, в итоге приходится имитировать или инстанцировать огромное количество функциональности. В системах стиля DoD вы почти всегда можете представить ядро преобразования как отдельную функцию, которая превращает один тип значений в другой.

Так гораздо проще рассуждать, тестировать и распараллеливать.

"По моему (любительскому) опыту, DoD создает тесную связь между данными и архитектурой, что приводит к тому, что изменения в структурах данных требуют больших затрат на рефакторинг. Это ваш опыт? Как вы справились с этой проблемой или избежали ее?"

RASMUS HÖÖK: По нашему опыту, при изменении данных обычно приходится изменять код, который их использует, даже до использования ECS. Так что мы не пострадали больше, чем привыкли!

ДЖО ВАЛЕНСУЭЛА: Я не думаю, что это фундаментальная проблема DoD или даже нашей ECS, по крайней мере, в том виде, в котором она развивалась с течением времени.

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

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

И наконец, я думаю, можно с уверенностью сказать, что DoD или, по крайней мере, ECS, делает гораздо большее количество проблемных состояний явными. Это не минус: Это совсем другой компромисс. Мне гораздо больше нравится рассуждать о тесной связке при рефакторинге, чем о свободной или подразумеваемой.

"Хорошо ли ECS/OOP работает для мобильных игр, или вы можете порекомендовать этот подход для проекта мобильной игры? Какие-то риски или соображения?"

ДЖО ВАЛЕНСУЭЛА: Многие наши клиенты успешно используют ECS в своих мобильных играх. Посмотрите этот доклад на GDC, чтобы узнать, как Sunblink Entertainment использовала его в игре HEROish.

"Как вы собирались налаживать связи с V Rising? Вы использовали Netcode for Entities или другой фреймворк?"

RASMUS HÖÖK: Мы создали свой собственный каркас. Мы начали использовать DOTS для производства очень рано и знали о рисках, связанных с этим. Чтобы исключить как можно больше рисков, мы старались полагаться на как можно меньшее количество пакетов и, по возможности, создавали свои собственные. Мы всегда делали многопользовательские игры и всегда использовали собственные решения, поэтому нам было удобно делать это самим.

"Достаточно ли стабилен ECS для производства? Последние несколько месяцев мы работали с прототипом и не уверены, были ли это боли роста, которые мы испытывали в процессе обучения, или же он еще не готов к чисто производственному проекту ECS".

RASMUS HÖÖK: Я бы сказал, что он достаточно стабилен для производства, но ему не хватает функций, которые многие разработчики игр считают само собой разумеющимися. Наш игровой код - это чистый ECS в V Rising, а вот презентационные вещи, такие как анимированные персонажи, эффекты частиц и пользовательский интерфейс, используют GameObjects. Реалистично, я думаю, что гибридный подход - лучший способ для большинства команд, начинающих проект сегодня.

Мы сделали V Rising, используя односторонний подход. Мы используем чистый ECS только для передачи данных GameObject'ам, но никак не наоборот. Например, мы храним состояние персонажа в данных ECS - вход, скорость и т. д., которые определяют состояние локомоции, а также то, какая анимация должна быть активна, в какое время и с какой скоростью. Затем мы убеждаемся, что аниматор объекта GameObject находится в этом состоянии. Состояние, в котором находится аниматор, никак не влияет на игровой процесс. Я считаю, что такое разделение в целом упрощает игру.

ДЖО ВАЛЕНСУЭЛА: ECS уже готов к производству и используется клиентами по всему миру, но нам еще предстоит пройти долгий путь, пока опыт работы с ним не станет настолько беспроблемным, как нам хотелось бы. Следите за дальнейшими событиями - и спасибо за использование DOTS!

Воплотите свою амбициозную игру в реальность с помощью DOTS, которая позволяет создавать масштабируемые, высокопроизводительные игры и незабываемые впечатления. Получите новейшие функции в Unity 2022 LTS и попробуйте новейшие технологии в Unity 6 Preview.