Внутренние менеджеры ECS ========================= .. _ecs-internal-managers: EntityManager ------------- .. doxygenclass:: prism::scene::EntityManager :members: :private-members: ComponentManager ---------------- .. _ecs-componentmanager: Менеджер компонентов отвечает за хранение и быстрый доступ к компонентам сущностей. Он организован по принципу **раздельного хранения по типам**: для каждого типа компонента создаётся отдельное хранилище. **Внутреннее устройство хранилища**: - ``std::vector components`` – плотный массив самих компонентов (cache‑friendly). - ``std::vector entities`` – параллельный массив идентификаторов сущностей. - ``std::unordered_map entityToIndex`` – хеш-таблица для отображения сущности на индекс в векторах. **Основные операции**: - *Добавление компонента*: если компонент уже существует – заменяем, иначе добавляем в конец векторов (O(1) амортизированно). - *Удаление компонента*: используется техника **swap with last** – удаляемый элемент заменяется последним, затем последний удаляется. Индексы корректируются (O(1)). - *Получение компонента по сущности*: поиск в хеш-таблице (O(1) в среднем). - *Проверка наличия*: аналогично. **Публичный интерфейс для пользователей** (доступен через класс ``Scene``): - ``addComponent(entity, value)`` – добавляет или заменяет компонент. - ``removeComponent(entity)`` – удаляет компонент. - ``hasComponent(entity)`` – проверяет наличие. - ``getComponent(entity)`` – возвращает указатель на компонент. - ``getEntitiesWith() const`` – возвращает **ссылку на вектор** сущностей, имеющих компонент T. Это позволяет эффективно итерировать. - ``getEntitiesWithAll() const`` – возвращает вектор сущностей, имеющих все указанные компоненты. Алгоритм оптимизирован: выбирается наименьший вектор кандидатов, и для каждой его сущности проверяется наличие остальных компонентов. - ``view() const`` – возвращает структуру с константными ссылками на внутренние векторы компонентов и сущностей для максимально эффективной массовой обработки (без повторных поисков). **Производительность**: благодаря плотным массивам и минимизации косвенных обращений, итерация по компонентам одного типа выполняется со скоростью линейного прохода по памяти. Пересечение типов требует O(min_n * k) операций, где min_n – размер наименьшего набора, k – количество типов. **Примечание**: тип сущности (``Entity``) является 32‑битным целым числом, что позволяет при необходимости заменить ``unordered_map`` на плоский массив (sparse set) для ещё более быстрого доступа, но текущая реализация уже обеспечивает хороший баланс между производительностью и гибкостью. .. doxygenclass:: prism::scene::ComponentManager :members: :private-members: SystemManager ------------- .. doxygenclass:: prism::scene::SystemManager :members: :private-members: ResourceManager --------------- .. doxygenclass:: prism::scene::ResourceManager :members: :private-members: Оптимизации ----------- - **Пул сущностей** - переиспользование ID - **Раздельное хранение** - компоненты по типам - **Быстрый поиск** - индексация сущностей по компонентам