Не так давно наткнулся на такой подход программирования в играх как ECS (Entity Component System). Далее начал читать статьи и смотреть различные ролики по этой теме. Из названия понятно что это разделение на сущности, компоненты и системы. Но почему он становится более предпочтительным в разработке игр нежели всем известный ООП с его подходами?
Для того чтобы это понять, нужно вспомнить как ваши данные ложатся в памяти. В обычном ООП мы объявляем множества полей в объекте и инкапсулируем логику внутри самого объекта. Из-за этого такие объекты хранятся в памяти разрозненно, соответственно при попадании в память процессора, которая является самой быстрой, обрабатываются дольше из-за того что ей нужно каждый раз загружать новый блок данных из разных мест.
Чтобы данные лежали плотно и при работе программы начинали переиспользоваться в кэше процессора, можно воспользоваться дизайном ориентированном на данных (Data-Oriented Design), по сути это чем-то похоже на базы данных, только в оперативной памяти.
Чтобы данные лежали плотно и при работе программы начинали переиспользоваться в кэше процессора, можно воспользоваться дизайном ориентированном на данных (Data-Oriented Design), по сути это чем-то похоже на базы данных, только в оперативной памяти.
Как раз это и использует ECS. Там сущности являются просто идентификаторами, компоненты структурами данных без логики, которые можно добавить и удалить для любой из сущностей, и системы для обработки логики, где итерации происходят по определённым компонентам. Например, игрок является сущностью, а его скорость, позиция и жизни компонентами, движение игрока будет системой, которая итерируется по компонентам скорости и позиции. Данный подход делает наш код практичным и переиспользуемым.
Я прошёлся по верхам и не рассказал как это реализуется, потому что существуют разные подходы. Вот несколько ссылок на различные статьи по этой теме:
Entity Component System FAQ
Let's build an Entity Component System from scratch (part 1)
Let's build an Entity Component System (part 2): databases
Building an ECS #1: Where are my Entities and Components
Building an ECS #2: Archetypes and Vectorization
Building an ECS #3: Storage in Pictures
Entity Component System FAQ
Let's build an Entity Component System from scratch (part 1)
Let's build an Entity Component System (part 2): databases
Building an ECS #1: Where are my Entities and Components
Building an ECS #2: Archetypes and Vectorization
Building an ECS #3: Storage in Pictures
Опрос: Слышали об ECS?
1.
Впервые слышу
2.
Слышал, но не применял
3.
Встречал на практике
4.
Писал свою реализацию
Ред. nazarpunk
agentSKucheyGovna[i]
worldState[i]
kuchaGovnaSpellov[i]
...
Ред. nazarpunk
Из меша узнаем, чей это меш, после чего идем в любой компонент этого объекта
Одна из фишек - одна и та же сущность может одновременно быть несколькими разными объектами, потому что набор висящих на ней компонентов будет по-разному интерпретироваться разными системами. Но мне, по факту использования, эта фишка пока особо не пригождалась.
Лично мне в душу запахло именно структурирование кода - разбиение его на маленькие системки, и их последовательный вызов. Да, системки вот прям маленькие - не больше 50 строк, а в среднем - вообще по 20-30 строчек.