1vanK
> А учитывая что ECS задумывался как плоская хрень, то использование в ней иерархии просто заваливание инвалида костылями
Ну так если тебе нужна иерархия объектов, тебе нужно где-то ее сделать, независимо от того, какую реализацию системы сцены ты используешь.
Ты описываешь (словами) пушку как сущность. Попытка сделать ее комопнентом — изначально костыль.
Да не нужна мне иерархия, я ее хочу избежать.
Если я начинаю использовать костылеобразную иерархию, мне этот ecs нафиг не вперся, ибо без него иерахия будет лучше выглядеть и работать.
1vanK
> Я же писал об этом, это приводит к иерархии, которую я хочу избежать и для которой ECS не очень приспособлен.
Иерархию делать сложнее, да, потому что ты больше не являешься единоличным владельцем всего, а хранишь все штуки в общем хранилище. Но вполне делаемо.
Это сложность — цена за все преимущества плоского хранилища. Упрощаешь вещи в одном месте, усложняешь в другом. Выбираешь, что тебе важнее.
1vanK
> Если я начинаю использовать костылеобразную иерархию, мне этот ecs нафиг не вперся, ибо без него иерахия будет лучше выглядеть и работать.
Ну да. Если тебе нужна иерархия, но не нужны фичи плоского хранилища, то зачем использовать плоское хранилище? Используй древохранилище. Ты потеряешь все знание о глобальном состоянии сцены (если ты не будешь трекать его вручную каждый раз), но иерархия будет естественным образом сформирована.
Суть в том, что этого никто не мерял, это полная чушь, что оно кэш френдли.
Мало того, что миллард раз по массивам бегаешь, что занимает лишнее процессорное время, так ты еще в каждой подсистеме собираешь несколько компонент сущности, это значит ты грузишь в кэш данные, которые валяются в разных частях памяти. А если уж маятся с этой иерархией на каждый чих, то левых данных в кэше еще больше будет
Eugene
> Ну да. Если тебе нужна иерархия, но не нужны фичи плоского хранилища, то зачем использовать плоское хранилище?
Так в том то и вопрос, это элементарный пример, где без иерархии никак, это какую-то синтетику надо выдумывать, чтобы оно в ecs себя хорошо чувствовало
1vanK
> Суть в том, что этого никто не мерял, это полная чушь, что оно кэш френдли.
А причем тут кеш-френдли?
С плоским хранилищем я могу посмотреть на тип компонента Т и мгновенно получить все объекты, у кого он есть. Или мгновенно узнать, есть ли произвольный компонент у объекта. Это невозможно сделать с деревом (без нудной возни с ручным треканием каждого компонента где-то).
Если тебе не нужны эти фичи, не используй плоское хранилище.
Как часто тебе надо смотреть все объекты с типом Т? И нужен ли именно для этой задачи ECS?
Внутри ECS не делает никакой магии, тот же массив с drawable можно ручками сформировать, а не городить в своем проекте стену из костылей в виде ecs
Хотя с drawable плохой пример, в котором ecs обострется еще сильнее, когда их надо хранить в октодереве
1vanK
> Как часто тебе надо смотреть все объекты с типом Т?
Ну, поскольку я использую EnTT, у меня 100% кода такие. Сложно сказать, сколько мест я бы смог органично заменить на LogicComponent::Update, а сколько нет. Я не хочу пытаться.
> Внутри ECS не делает никакой магии, тот же массив с drawable можно ручками сформировать
Ну как бы я манал ручками формировать и поддерживать сто массивов. Иерархию я хотя бы один раз сделал и она работает, а костыль в виде ручного массива мне на каждый чих и пук дописывать придется.
1vanK
> Хотя с drawable плохой пример, в котором ecs обострется еще сильнее, когда их надо хранить в октодереве
Чем EnTT в этом плане отличается от того, как урха прямо сейчас втыкает объекты в октодерево?) Кстати версия Урхи тоже нерасширяемое днище то еще. Попробуй добавить опциональную альтернативу октодереву.
Если что это не нытье от меня, как от чела, который не осилил. Это нытьё от чела, который осилил, и пришел к выводу, что ecs - говнище )) Я переписал леталку на ecs довольно быстро и теперь гораздо больше времени гроблю на то, чтобы оно было человекочитаемым, разбить на компоненты правильно и т.д. https://github.com/dviglo2d-learn/mini_games/tree/fdfddd
1vanK
> Если что это не нытье от меня, как от чела, который не осилил. Это нытьё от чела, который осилил, и пришел к выводу, что ecs - говнище ))
Чел, который забивает гвозди микроскопом, и жалуется на неудобную ручку.
> Я переписал леталку на ecs довольно быстро и теперь гораздо больше времени гроблю на то, чтобы оно было человекочитаемым, разбить на компоненты правильно и т.д.
"Переписывание" это вообще дурацкая затея кмк. Это как переписывать код с retained mode UI на immediate mode UI или наоборот. Подход к архитектуре насколько разный, что любое переписывание будет невыносимо болезненным и/или хреновым.
Я свой игровой EnTT код на урховские компоненты вообще переписать не смогу (без кучи ручной копипасты и боли), он на них тупо не ложится.
Eugene
> Я свой игровой EnTT код на урховские компоненты вообще переписать не смогу (без кучи ручной копипасты и боли), он на них тупо не ложится.
Немного разверну пример.
Вот у меня есть три разные игровые системы, которые делают разные вещи, читают данные, пишут данные.
Одна работает только с объектами, у которых есть компоненты А, Б, В.
Вторая работает только с объектами, у которых есть компоненты А, Б, Г.
Третья работает только с объектами, у которых есть компоненты Б, В, Г.
Вопрос знатокам — как мне переписать эти три системы на урховские компоненты, без использования костылей в виде ручных массивов и трекинга?
В EnTT это просто три цикла в трех разных функциях, проще некуда.