Не так давно наткнулся на такой подход программирования в играх как ECS (Entity Component System). Далее начал читать статьи и смотреть различные ролики по этой теме. Из названия понятно что это разделение на сущности, компоненты и системы. Но почему он становится более предпочтительным в разработке игр нежели всем…
Тема
23 126
38
nazarpunk, модуль коллизий хранит массив всех текущих столкновений - это 2 индекса мешей/примитивов, нормалей и глубины проникновения
Из меша узнаем, чей это меш, после чего идем в любой компонент этого объекта
16
nazarpunk, ниже по тексту написал. То что объекты и его иерархия никак не подразумевает хранение плотно в памяти, потому что куча ссылок и наследований других полей. В DOD подходе мы реализуем данные так чтобы они хранились плотно в массивах и обход по ним происходит быстрее, за счёт попадания в кэш процессора и повторного переиспользования без необходимости заново загружать в память процессора, какого блока памяти.
16
nazarpunk, зависит от реализации, например, это на прямую хранить в мапе по id сущности массив его компонентов, компоненты можно добавлять и удалять. Ты наверное не понял, у каждой сущности свой инстанс этих компонентов.
30
позиция и хп это компоненты
Каким образом они слинкованы? Если при получении достаточного урона юнит умер, то его вектор не передастся следующему юниту. Как это делается?
30
Угадай в каком решении быстрее сделать обходы и умножения векторов много раз в секунду
А насколько у нас тесные связи? Вот допустим у нас есть система аур. Одна аура распространяет пониженную гравитацию в сфере. Другая распространяет вектор гравитации к своему центру. Третья убирает коллизии на своём радиусе. Как нам поможет ECS?
Ну или вообще по классике. Есть у нас дерево. Как удалить родителя не оставив висячих ссылок в пустоте? В ООП это разрулится деструкторами. А в ECS?
16
nazarpunk, позиция и хп это компоненты, данные которые ты добавляешь в сущности, а сущность это просто ссылка (id) на какой-то набор этих компонентов. Тут отношение один ко многим.
16
nazarpunk, входит, это системы. Например как в Unity есть метод update, в котором пишут какую-то логику. Получается что ты в таком методе проходишься по массиву нужных тебе компонентов, которые есть у сущностей, и от этого пишешь логику.
30
bifurcated, а каким образом связаны собственно позиции и хп. Это же по сути разные сущности. Ну или более банальный пример. У нас физический движок и нужен маятник Ньютона? Как передать импульс ровно последнему шарику?
Загруженные файлы
16
nazarpunk, скорее у юнита будет компонент, отвечающий за его хит бокс и у тебя будет система, которая проходится по сущностям у которых есть какой-то архетип компонентов, как скорость, позиция, хп, хит бокс. И при условии что у каких-то двух объектах расстояние близкое, то наносим урон в зависимости от скорости отнимая от текущего хп
30
ScorpioT1000, а как слинковать сущности между собой? Например нанести юниту урон от столкновения?