stringtranslate.com

Система компонентов сущности

Простая схема «Сущность–Компонент–Система».

Сущность–компонент–система ( ECS ) — это программный архитектурный шаблон, который в основном используется в разработке видеоигр для представления объектов игрового мира. ECS включает сущности, состоящие из компонентов данных, с системами , которые работают с компонентами.

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

Особенно когда написано «Entity Component System», из-за неоднозначности в английском языке, общепринятая интерпретация названия заключается в том, что ECS — это система, включающая сущности и компоненты. Например, в докладе 2013 года на GDC [1] Скотт Билас сравнивает объектную систему C++ и свою новую пользовательскую компонентную систему. Это согласуется с традиционным использованием термина «система» в общей системной инженерии с Common Lisp Object System и системой типов в качестве примеров.

Характеристики

ECS объединяет ортогональные, устоявшиеся идеи в общей компьютерной науке и теории языков программирования . Например, компоненты можно рассматривать как идиому миксина в различных языках программирования. Компоненты являются специализированным случаем в рамках общего подхода делегирования и протокола метаобъектов . То есть, любая полная система объектов компонентов может быть выражена с помощью шаблонов и модели эмпатии в рамках видения объектно-ориентированного программирования Договора Орландо [2] .

Сущность : Сущность представляет собой объект общего назначения. Например, в контексте игрового движка каждый грубый игровой объект представлен как сущность. Обычно он состоит только из уникального идентификатора. Реализации обычно используют для этого простое целое число. [3]

Компонент : Компонент характеризует сущность как обладающую определенным аспектом и содержит данные, необходимые для моделирования этого аспекта. Например, каждый игровой объект, который может получить урон, может иметь компонент Health, связанный с его сущностью. Реализации обычно используют структуры , классы или ассоциативные массивы . [3]

Система : Система — это процесс, который действует на все сущности с желаемыми компонентами. Например, физическая система может запрашивать сущности, имеющие компоненты массы, скорости и положения, и перебирать результаты, выполняя физические вычисления на наборе компонентов для каждой сущности.

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

История

В 1998 году Thief: The Dark Project впервые использовал ECS. [4] Этот движок позже использовался в его продолжении, а также в System Shock 2 .

В 2002 году Скотт Билас из Gas Powered Games (Dungeon Siege) выступил с основополагающим докладом по ECS. [1] Это вдохновило на многочисленные более поздние известные реализации.

В начале января 2007 года Мик Уэст , работавший над серией игр Tony Hawk, поделился своим опытом внедрения ECS в Neversoft. [5]

Также в 2007 году команда, работающая над Operation Flashpoint: Dragon Rising , экспериментировала с проектами ECS, включая проекты, вдохновлённые Bilas/ Dungeon Siege , а Адам Мартин позже написал подробный отчёт о проектировании ECS, [6] включая определения основных терминов и концепций. [7] В частности, работа Мартина популяризировала идеи систем как первоклассных элементов, сущностей как идентификаторов, компонентов как необработанных данных и кода, хранящегося в системах, а не в компонентах или сущностях.

В 2015 году Apple Inc. представила GameplayKit — API- фреймворк для разработки игр для iOS , macOS и tvOS , включающий реализацию ECS. [8]

В августе 2018 года Сандер Мертенс создал популярный фреймворк flecs ECS. [9]

В октябре 2018 года [10] компания Unity выпустила свою демонстрационную версию мегаполиса, которая использовала технологический стек, построенный на ECS. ECS от Unity работает на мощной оптимизированной архитектуре, известной как DOTS, которая «позволяет создателям масштабировать обработку высокопроизводительным образом».

Вариации

Структура данных различных ECS может различаться, равно как и определение компонентов, их связь с сущностями и то, как системы получают доступ к компонентам сущностей.

ECS Мартина

Адам Мартин в своей серии блогов определяет, что он считает сущностью-компонентом-системой. [7]

Сущность состоит только из идентификатора для доступа к компонентам. Обычной практикой является использование уникального идентификатора для каждой сущности. Это не является обязательным требованием, но имеет несколько преимуществ:

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

Компоненты не имеют внутри себя игрового кода (поведения). Компоненты не обязательно должны быть физически расположены вместе с сущностью, но должны быть легкодоступны и доступны с помощью сущности.

«Каждая Система работает непрерывно (как будто у каждой Системы есть свой собственный частный поток) и выполняет глобальные действия над каждой Сущностью, которая обладает Компонентом или Компонентами, соответствующими запросу этой Системы».

Игровой движок Unity

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

Аппарат ECS

Apparatus — это сторонняя реализация ECS для Unreal Engine , которая ввела некоторые дополнительные функции в общую парадигму ECS. Одной из этих функций является поддержка иерархии типов для компонентов. Каждый компонент может иметь базовый тип компонента (или базовый класс), как в ООП . Затем система может выполнить запрос с базовым классом и получить всех его потомков, сопоставленных в результирующем выборе сущностей. Это может быть очень полезно для некоторой общей логики, которая должна быть реализована на наборе различных компонентов, и добавляет дополнительное измерение в парадигму.

ФЛЕКС

Flecs — это быстрая и легкая реализация ECS для C и C++, которая позволяет создавать игры и симуляции с миллионами сущностей.

Распространенные закономерности использования ECS

Обычный способ передачи данных между системами — хранить данные в компонентах, а затем каждая система последовательно получает доступ к компоненту. Например, положение объекта может регулярно обновляться. Затем это положение используется другими системами. Если есть много разных редких событий, потребуется много флагов в одном или нескольких компонентах. Тогда системам придется отслеживать эти флаги на каждой итерации, что может стать неэффективным. Решением может быть использование шаблона наблюдателя . Все системы, зависящие от события, подписываются на него. Таким образом, действие из события будет выполнено только один раз, когда оно произойдет, и опрос не потребуется.

ECS не имеет проблем с проблемами зависимостей, которые обычно встречаются в объектно-ориентированном программировании, поскольку компоненты являются простыми контейнерами данных, у них нет зависимостей. Каждая система обычно запрашивает набор компонентов, которые должна иметь сущность, чтобы система могла с ней работать. Например, система рендеринга может регистрировать модель, преобразование и компоненты для рисования. Когда она работает, система будет выполнять свою логику для любой сущности, которая имеет все эти компоненты. Другие сущности просто пропускаются, без необходимости в сложных деревьях зависимостей. Однако это может быть местом, где могут скрываться ошибки, поскольку распространение значений из одной системы в другую через компоненты может быть сложным для отладки. ECS может использоваться там, где несвязанные данные должны быть привязаны к заданному времени жизни.

ECS использует композицию, а не деревья наследования. Сущность обычно состоит из идентификатора и списка компонентов, которые к ней прикреплены. Любой игровой объект может быть создан путем добавления правильных компонентов к сущности. Это позволяет разработчику легко добавлять функции к сущности без каких-либо проблем с зависимостями. Например, к сущности игрока может быть добавлен компонент пули , и тогда она будет соответствовать требованиям для манипулирования некоторой системой bulletHandler , что может привести к тому, что игрок будет наносить урон вещам, врезаясь в них.

Преимущества использования ECS для хранения игрового состояния были провозглашены многими разработчиками игр, такими как Адам Мартин. Хорошим примером являются записи в блоге Ричарда Лорда, где он обсуждает преимущества и то, почему разработанные ECS системы хранения игровых данных настолько полезны. [11]

Использование вне игр

Хотя ECS в основном используется в разработке видеоигр, он может быть полезен и в других областях. [12] [ нужен пример ]

Смотрите также

Примечания

Ссылки

  1. ^ ab Bilas, Scott. "A Data-Driven Game Object System" (PDF) . Архивировано (PDF) из оригинала 18 сентября 2013 г. . Получено 25 декабря 2013 г. .
  2. ^ Линн Андреа Штайн, Генри Либерман, Дэвид Унгар: Общий взгляд на совместное использование: Договор Орландо . В: Вон Ким, Фредерик Х. Лоховски (ред.): Объектно-ориентированные концепции, базы данных и приложения ACM Press, Нью-Йорк 1989, гл. 3, стр. 31–48 ISBN 0-201-14410-7 (онлайн Архивировано 07.10.2016 на Wayback Machine
  3. ^ ab "Entity Systems Wiki". Архивировано из оригинала 31 декабря 2019 г. Получено 31 декабря 2019 г.
  4. ^ «Неизвестный шаблон проектирования». 11 марта 2021 г.
  5. ^ «Развивайте свою иерархию». 5 января 2007 г.
  6. ^ Мартин, Адам. «Системы сущностей — будущее разработки MMOG». Архивировано из оригинала 26 декабря 2013 г. Получено 25 декабря 2013 г.
  7. ^ ab Martin, Adam. "Entity Systems are the Future of MMOG Development Part 2". Архивировано из оригинала 26 декабря 2013 г. Получено 25 декабря 2013 г.
  8. ^ "Представляем GameplayKit - WWDC 2015 - Видео". Архивировано из оригинала 2017-10-06 . Получено 2017-10-06 .
  9. ^ "SanderMertens - Обзор". GitHub . Получено 2021-09-06 .
  10. ^ "Unity представляет демо Megacity — миллионы объектов в огромном киберпанковом мире". MCV/DEVELOP . 2018-10-24 . Получено 2021-06-24 .
  11. ^ «Зачем использовать архитектуру Entity Component System для разработки игр?». www.richardlord.net . Получено 18.11.2021 .
  12. ^ Ромео, Витторио. (2016): Анализ методов кодирования сущностей, проектирование и реализация многопоточной библиотеки Entity-Component-System C++14 времени компиляции 10.13140/RG.2.1.1307.4165. (https://www.researchgate.net/publication/305730566_Analysis_of_entity_encoding_techniques_design_and_implementation_of_a_multithreaded_time_compile_Entity-Component-System_C14_library)

Внешние ссылки