Spiiin's blog

ECS. Ссылки

ECS - паттерн программирования, используемый в геймдеве. Основная идея - есть пул сущностей (entities), на которые можно добавлять компоненты (данные без логики - components). Сущности и компоненты читаются, модифицируются, создаются и удаляются только с помощью систем(systems). Подход немного отличен от традционного ООП, и от ECs (сущности разбиваются на компоненты - логика хранится как в классах-сущностях, так и в компонентах), так что требует ознакомления и практики перед использованием

История и примеры практического применения в больших играх

Dungeon Siege - A Data-Driven Game Object System
Operation Flashpoint 2
GrexEngine (движок для mmo-rpg) - Cерия статей, и ссылка ещё на одну презу из dungeon siege
World of Tanks Blitz - Создание World of Tanks Blitz на базе собственного движка DAVA
Wooga (немецкая студия, разрабатывает казуалки) - для матч-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/Circle
Practical Optimizations — Jason Booth, замеры производительности и некоторые приёмы организации кода, связанные с DoD.

Важные идеи:
Optimization is DESIGN time problem
Performance is a feature