Каков «канонический» или лучший способ связывания компонентов с конкретными объектами в ECS? - PullRequest
1 голос
/ 03 мая 2020

Я видел большое количество разных, противоречивых предложений о том, как хранить информацию в системе Entity Component System - некоторые рекламируют «чистоту» или оптимизацию кэша, без особых объяснений. Как общее резюме:

  1. Список объектов, которые хранят компоненты внутри своей структуры (например, какой-то unordered_map<type_info, IComponent*> в C ++). Системы отслеживают свой собственный список, в котором в настоящее время активные объекты обладают компонентами, с которыми они работают.

  2. То же, что и 1, за исключением того, что системы выполняют глобальные итерации по всем объектам и проверяют, какие компоненты они содержат.

  3. Существует отдельный список для каждого типа компонентов, и нет фактического сохраненного списка «сущностей» - системы перебирают свои соответствующие компоненты и должны каким-то образом находить другие связанные компоненты, которые принадлежат к той же сущности, через какой-то уникальный идентификатор, который их связывает. Хранение компонентов в списке, подобном этому, поддерживается как предположительно улучшающее локальность кэша (хотя я не понимаю, как, поскольку вы все равно будете искать в нескольких больших списках, чтобы найти связанные компоненты для конкретной сущности), и не иметь фактического ' Тип сущности предположительно является признаком «чистого» ECS.

  4. Каждый тип компонента имеет свой собственный глобальный контейнер / список, но все еще есть список структур сущностей, которые отслеживают какие компоненты принадлежат какой-то конкретной сущности. Системы ведут себя как в 1 или 2.

Я также нашел некоторые аргументы в пользу «одного типа компонента на систему» ​​- что упростит некоторые из проблем системы 3, но будет в целом очень мало смысла.

Так что мой вопрос - прорезать весь шум различных реализаций, является ли какой-либо из них «идеальным» или «каноническим» способом создания ECS? Довольно сложно проанализировать преимущества и недостатки каждого из этих дизайнов и их множество различных вариантов. Я обычно реализовывал их, как в '1' из моего списка выше, что оказалось удобным, но не обязательно оптимальным.

...