ECS - паттерн программирования, используемый в геймдеве. Основная идея - есть пул сущностей (entities
), на которые можно добавлять компоненты (данные без логики - components
). Сущности и компоненты читаются, модифицируются, создаются и удаляются только с помощью систем(systems
). Подход немного отличен от традционного ООП, и от ECs (сущности разбиваются на компоненты - логика хранится как в классах-сущностях, так и в компонентах), так что требует ознакомления и практики перед использованием
История и примеры практического применения в больших играх
Dungeon Siege
- A Data-Driven Game Object System
Operation Flashpoint 2
GrexEngine
(движок для mmo-rpg) - Cерия статей, и ссылка ещё на одну презу из dungeon siegeWorld of Tanks Blitz
- Создание World of Tanks Blitz на базе собственного движка DAVAWooga
(немецкая студия, разрабатывает казуалки) - для матч-3 и стратегии. Ссылки на видео в следующем разделе.Overwatch
- Ссылка на видео в следующем разделе (в комментариях к ютуб лекции ещё несколько разработчиков игр отписывались, например Mercenaries 2
)Minecraft
- Использует библиотеку entt.
Видео презентации
Entitas - Entity System Architecture with Unity - Unite Europe 2015.
Доклад от Макса Закса и Саймона Шмидта о библиотеке Entitas для Unity - идеи, и как совмещать объектами Unity.
Unite Europe 2016 - ECS architecture with Unity by example
От них же, практическое применение библиотеки Entitas для решения конкретной задачи, создания интерфейса в стиле Clash Royale.
Кирилл Надеждин (Kumo Kairo) - ECS в разработке игр — хорошая архитектура приложений для всех
Обзор entitas и ссылки на другие примеры использования ECS в играх, на русском. Примеры проблем, которые приводят к тому, чтобы перейти на ECS.
Wargaming.net: Архитектура современных 3D движков (DevGAMM Minsk 2014)
Архитектура современных 3D движков, Виталий Бородовский, Technical Director WoT Blitz
Overwatch Gameplay Architecture and Netcode
Разбирается внутренняя ECS близзрад. Cамая объёмная и сложная для понимания презентация, тут на 0.75 лучше смотреть. Почему пришли к применению ECS, с какими проблемами сталкивались и как их решали. Обзор после 3х лет использования такой архитектуры на практике.
itCppCon19 - ECS back and forth (Michele Caini)
Обзор внутреннего устройства ECS на C++ - разбор двух типов архитектур - на основе “архетипов” и “разреженных множеств”. Можно также почитать в ECS-FAQ (ссылка в следующем разделе)
Game Engine Entity/Object Models
Game Engine Entity/Object Models, Bobby Anguelov. Обзор различных архитектур, плюсы и минусы подходов EC и ECS в различных движках
Обзоры библиотек
Entity Component System FAQ - общий обзор подхода, терминология, список библиотек, примеры применения в продакшене.
Entity-Component-Systems Benchmark - бенчмарк различных библиотек
EnTT - production-ready c++ библиотека, используемая в Minecraft
, с примерами использования (самый простой - pacman), документацией и блогом
flecs - c/c++ библиотека с большим количеством примеров и функционала (есть модули для сериализации, рефлексии, продвинутое api для обращения с сущностями). Мануал
Entitas - библиотека на C# для использования с Unity (порты на другие языки можно не смотреть. Возможно, стоит смотреть сразу штатный ECS для Unity - Unity DOTS.
Ссылки
Обсуждение на gamedev.ru - пост с большой коллекцией ссылок
Entity Systems Wiki - вики с терминологией, ссылками, список библиотек для разных языков.
Artemis - академическая реализация ECS на Java, посмотреть как задумано.
Data-oriented Design (DoD)
Теория, если сходу не очень понятны идеи ECS.
Data-Oriented Design - фундаментальная книжка по DoD от Richard Fabian
Data Oriented Design Resources - список материалов по DOD
Data-Oriented Design (или почему, используя ООП, вы, возможно, стреляете себе в ногу) - перевод статьи Noel Llopis
Data-Oriented Design - Links and Thoughts - коллекция ссылок на статьи, многие gamedev-related.
DOD в Battlefield - исследование прироста скорости от правильного расположения структур в памяти, полезные ссылки в конце доклада
Stoyan Nikolov “OOP Is Dead, Long Live Data-oriented Design” - видео доклада Стояна Николова с примером разницы подходов к решению практической задачи - OOP vs DoD.
Примеры библиотек, спроектированных с применением подхода data-oriented design:
Dear ImGui
bgfx
update 2023.11.03
Еще пара ссылок по замерам производительности:
“Clean” Code, Horrible Performance — доклад от Casey Muratory, замеры на простых примерах Shape/Square/CirclePractical Optimizations
— Jason Booth, замеры производительности и некоторые приёмы организации кода, связанные с DoD.
Важные идеи:Optimization is DESIGN time problem
Performance is a feature