Система компонентов сущности
![]() | Эта статья написана как личное размышление, личное эссе или аргументативное эссе , в котором излагаются личные чувства редактора Википедии или представлен оригинальный аргумент по определенной теме. ( Октябрь 2013 г. ) |

Система компонентов сущности ( ECS ) [а] — это архитектурный шаблон программного обеспечения, который чаще всего используется при разработке видеоигр для представления объектов игрового мира. ECS включает в себя объекты, состоящие из компонентов данных, и системы , которые работают с этими компонентами.
ECS следует принципу композиции, а не наследования , что означает, что каждая сущность определяется не иерархией типов, а связанными с ней компонентами. Системы действуют глобально по всем объектам, имеющим необходимые компоненты.
Однако из-за двусмысленности английского языка общепринятая интерпретация названия заключается в том, что ECS — это система, состоящая из объектов и компонентов. Например, в выступлении на GDC 2013 года: [1] Скотт Билас сравнивает объектную систему C++ и свою новую систему пользовательских компонентов. Это согласуется с традиционным использованием системного термина в общей системной инженерии с использованием объектной системы Common Lisp и системы типов в качестве примеров.
Характеристики
[ редактировать ]ECS сочетает в себе ортогональные, устоявшиеся идеи общей информатики и теории языков программирования . Например, компоненты можно рассматривать как идиому примеси в различных языках программирования. Компоненты представляют собой особый случай в рамках общего подхода делегирования (объектно-ориентированного программирования) и метаобъектного протокола . То есть любая полная компонентная объектная система может быть выражена с помощью шаблонов и модели эмпатии в рамках Орландского договора. [2] видение объектно-ориентированного программирования .
Сущность : Сущность представляет собой объект общего назначения. Например, в контексте игрового движка каждый грубый игровой объект представлен как сущность. Обычно он состоит только из уникального идентификатора. Реализации обычно используют для этого простое целое число. [3]
Компонент : компонент характеризует объект как обладающий определенным аспектом и содержит данные, необходимые для моделирования этого аспекта. Например, каждый игровой объект, который может получить урон, может иметь компонент «Здоровье», связанный с его сущностью. Реализации обычно используют структуры , классы или ассоциативные массивы . [3]
Система : Система — это процесс, который воздействует на все объекты с помощью желаемых компонентов. Например, физическая система может запрашивать объекты, имеющие компоненты массы, скорости и положения, и перебирать результаты, выполняя физические вычисления для набора компонентов для каждого объекта.
Поведение объекта может быть изменено во время выполнения системами, которые добавляют, удаляют или изменяют компоненты. Это устраняет проблемы неоднозначности глубоких и широких иерархий наследования, часто встречающихся в методах объектно-ориентированного программирования , которые трудно понять, поддерживать и расширять. Общие подходы ECS хорошо совместимы с методами проектирования, ориентированными на данные , и часто сочетаются с ними . Данные для всех экземпляров компонента хранятся в физической памяти последовательно, что обеспечивает эффективный доступ к памяти для систем, которые работают с множеством объектов.
История
[ редактировать ]В 1998 году Thief: The Dark Project впервые представил ECS. [4] Позднее этот движок использовался в ее продолжении, а также в System Shock 2 .
В 2007 году команда, работавшая над Operation Flashpoint: Dragon Rising , экспериментировала с проектами ECS, в том числе вдохновленными Bilas/ Dungeon Siege , а Адам Мартин позже написал подробный отчет о дизайне ECS: [5] включая определения основной терминологии и понятий. [6] В частности, работа Мартина популяризировала идеи систем как первоклассных элементов, сущностей как идентификаторов, компонентов как необработанных данных и кода, хранящегося в системах, а не в компонентах или сущностях.
В 2015 году Apple Inc. представила GameplayKit — инфраструктуру API для разработки игр для iOS , macOS и tvOS , включающую реализацию ECS. [7]
В августе 2018 года Сандер Мертенс создал популярную платформу ECS flecs . [8]
В октябре 2018 года [9] Компания Unity выпустила демо-версию мегаполиса, в которой использовался технологический стек, построенный на ECS. В нем было 100 000 аудиоисточников — по одному на каждую машину, неоновую вывеску и т. д. — создавая большой и сложный звуковой ландшафт. [9]
Вариации
[ редактировать ]Структура данных разных ECS может отличаться, равно как и определение компонентов, то, как они связаны с сущностями и как системы получают доступ к компонентам сущностей.
ECS Мартина
[ редактировать ]Популярная серия блогов Адама Мартина определяет, что он считает архитектурой Entity Component System: [6]
Сущность состоит только из идентификатора для доступа к компонентам. Обычной практикой является использование уникального идентификатора для каждого объекта. Это не является обязательным требованием, но имеет ряд преимуществ:
- На сущность можно ссылаться, используя идентификатор вместо указателя. Это более надежно, так как позволяет уничтожить объект, не оставляя висящих указателей.
- Это помогает сохранить состояние извне. Когда состояние загружается снова, нет необходимости восстанавливать указатели.
- При необходимости данные можно перетасовать в памяти.
- Идентификаторы объектов можно использовать при общении по сети для уникальной идентификации объекта.
Некоторых из этих преимуществ можно также достичь с помощью интеллектуальных указателей .
Внутри компонентов нет игрового кода (поведения). Компоненты не обязательно должны быть физически расположены вместе с объектом, но их должно быть легко найти и получить к ним доступ с помощью объекта.
«Каждая система работает непрерывно (как если бы каждая система имела свой собственный частный поток) и выполняет глобальные действия над каждой сущностью, которая имеет компонент или компоненты, соответствующие запросу этой системы».
Игровой движок Unity
[ редактировать ]В макете Unity есть таблицы, каждая из которых содержит столбцы компонентов. объекта В этой системе тип основан на компонентах, которые он содержит. Для каждого типа сущности существует таблица (называемая архетипом ), содержащая столбцы компонентов, соответствующих компонентам, используемым в сущности. Чтобы получить доступ к определенной сущности, необходимо найти правильный архетип (таблицу) и индекс в каждом столбце, чтобы получить каждый соответствующий компонент для этой сущности.
Аппарат ЭКС
[ редактировать ]Apparatus — это сторонняя реализация ECS для Unreal Engine , которая привнесла некоторые дополнительные функции в общую парадигму ECS. Одной из таких функций является поддержка иерархии типов компонентов. Каждый компонент может иметь базовый тип компонента (или базовый класс), как в ООП . Затем система может запросить базовый класс и получить соответствие всех его потомков в результирующем выборе сущностей. Это может быть очень полезно для реализации некоторой общей логики в наборе различных компонентов и добавляет дополнительное измерение в парадигму.
ФЛЕКС
[ редактировать ]Flecs — это быстрая и легкая реализация ECS для C и C++, которая позволяет создавать игры и симуляции с миллионами объектов.
Общие закономерности использования ECS
[ редактировать ]Обычный способ передачи данных между системами — хранить данные в компонентах, а затем обеспечивать последовательный доступ каждой системы к компоненту. Например, положение объекта может регулярно обновляться. Эта позиция затем используется другими системами. Если разных нечастых событий много, в одном или нескольких компонентах понадобится много флагов. Тогда системам придется отслеживать эти флаги на каждой итерации, что может оказаться неэффективным. Решением может быть использование шаблона наблюдателя . Все системы, зависящие от события, подписываются на него. Таким образом, действие события будет выполнено только один раз, когда оно произойдет, и никакой опрос не требуется.
В архитектуре ECS нет проблем с проблемами зависимостей, обычно встречающимися в объектно-ориентированном программировании, поскольку компоненты представляют собой простые сегменты данных и не имеют зависимостей. Каждая система обычно запрашивает набор компонентов, которые должен иметь объект, чтобы система могла с ним работать. Например, система рендеринга может регистрировать модель, преобразование и рисуемые компоненты. При запуске система будет выполнять свою логику на любом объекте, имеющем все эти компоненты. Другие сущности просто пропускаются, и нет необходимости в сложных деревьях зависимостей. Однако это может быть местом, где скрываются ошибки, поскольку распространение значений из одной системы в другую через компоненты может оказаться затруднительным для отладки. ECS может использоваться там, где несвязанные данные необходимо привязать к заданному сроку службы.
Архитектура ECS использует композицию, а не деревья наследования. Объект обычно состоит из идентификатора и списка прикрепленных к нему компонентов. Любой игровой объект можно создать, добавив к сущности правильные компоненты. Это позволяет разработчику легко добавлять функции к объекту без каких-либо проблем с зависимостями. Например, к сущности игрока может быть добавлен компонент пули , и тогда он будет соответствовать требованиям, которым должна управлять некоторая система BulletHandler , что может привести к тому, что игрок нанесет ущерб вещам, наткнувшись на них.
Преимущества использования ECS для хранения состояния игры были провозглашены многими разработчиками игр, такими как Адам Мартин. Хорошим примером являются сообщения в блоге Ричарда Лорда, в которых он обсуждает преимущества и то, почему системы хранения игровых данных, разработанные ECS, так полезны. [10]
Использование вне игр
[ редактировать ]Хотя архитектура ECS в основном используется при разработке видеоигр, она может быть полезна и в других областях. [11] [ нужен пример ]
См. также
[ редактировать ]Примечания
[ редактировать ]- ^ Чтобы избежать двусмысленности в этой статье, мы после слов «Система компонентов сущности» добавляем такое существительное, как «фреймворк» или «архитектура». Слово «система» в данном контексте всегда употребляется в единственном числе.
Ссылки
[ редактировать ]- ^ Билас, Скотт. «Система игровых объектов, управляемая данными» (PDF) . Архивировано (PDF) из оригинала 18 сентября 2013 года . Проверено 25 декабря 2013 г.
- ^ Линн Андреа Стейн, Генри Либерман, Дэвид Унгар: Общий взгляд на обмен: Орландский договор . В: Вон Ким, Фредерик Х. Лоховский (ред.): Объектно-ориентированные концепции, базы данных и приложения ACM Press, Нью-Йорк, 1989, гл. 3, стр. 31–48. ISBN 0-201-14410-7 ( онлайн- архивировано 7 октября 2016 г. в Wayback Machine )
- ^ Jump up to: а б «Entity Systems Wiki» . Архивировано из оригинала 31 декабря 2019 года . Проверено 31 декабря 2019 г.
- ^ «Неизвестный шаблон проектирования» . 11 марта 2021 г.
- ^ Мартин, Адам. «Системы сущностей — будущее развития MMOG» . Архивировано из оригинала 26 декабря 2013 года . Проверено 25 декабря 2013 г.
- ^ Jump up to: а б Мартин, Адам. «Системы сущностей — будущее разработки MMOG, часть 2» . Архивировано из оригинала 26 декабря 2013 года . Проверено 25 декабря 2013 г.
- ^ «Представляем GameplayKit — WWDC 2015 — Видео» . Архивировано из оригинала 6 октября 2017 г. Проверено 6 октября 2017 г.
- ^ «СандерМертенс — Обзор» . Гитхаб . Проверено 06 сентября 2021 г.
- ^ Jump up to: а б «Unity представляет демо-версию Megacity — миллионы объектов в огромном мире киберпанка» . MCV/РАЗРАБОТКА . 24 октября 2018 г. Проверено 24 июня 2021 г.
- ^ «Зачем использовать архитектуру Entity Component System для разработки игр?» . www.richardlord.net . Проверено 18 ноября 2021 г.
- ^ Ромео, Витторио. (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_compile-time_Entity-Component-System_C14_library )