Я создаю компонент на основе системы игры объекта . Некоторые советы:
GameObjectэто просто списокComponents.- Есть
GameSubsystems. Например, рендеринг, физика и т. Д. КаждыйGameSubsystemсодержит указатели на некоторые изComponents.GameSubsystemэто очень мощная и гибкая абстракция: она представляет собой любой фрагмент (или аспект) игрового мира.
Существует необходимость в механизме регистрации Componentsв GameSubsystems(когда GameObjectсоздается и в составе). Есть 4 подхода :
- 1: Цепь ответственности шаблона. Каждый
Componentпредлагается каждомуGameSubsystem.GameSubsystemпринимает решение , котороеComponentsдля регистрации (и как организовать их). Например, GameSubsystemRender может зарегистрировать визуализируемые компоненты.
профи. Componentsничего не знаю о том, как они используются. Низкая связь. А. Мы можем добавить новое GameSubsystem. Например, давайте добавим GameSubsystemTitles, который регистрирует все ComponentTitle и гарантирует, что каждый заголовок уникален и предоставляет интерфейс для запроса объектов по заголовку. Конечно, ComponentTitle не должен быть переписан или унаследован в этом случае. Б. Мы можем реорганизовать существующие GameSubsystems. Например, GameSubsystemAudio, GameSubsystemRender, GameSubsystemParticleEmmiter могут быть объединены в GameSubsystemSpatial (чтобы поместить все аудио, emmiter, рендеринг Componentsв одну иерархию и использовать родительские относительные преобразования).
против. Индивидуальная проверка. Очень неэффективно.
против. Subsystemsзнать о Components.
- 2: Каждый
SubsystemищетComponentsопределенные типы.
профи. Лучшая производительность, чем в Approach 1.
против. Subsystemsеще знаю о Components.
- 3:
Componentрегистрируется вGameSubsystem(s). Во время компиляции мы знаем, что существует GameSubsystemRenderer, поэтому давайте ComponentImageRender вызовет что-то вроде GameSubsystemRenderer :: register (ComponentRenderBase *).
профи. Производительность. Нет ненужных проверок, как в Approach 1.
против. Componentsплохо связаны с GameSubsystems.
- 4: образец посредника .
GameState(который содержитGameSubsystems) может реализовать registerComponent (Component *).
профи. Componentsи GameSubystemsничего не знаем друг о друге.
против. В C ++ это выглядело бы как уродливый и медленный переключатель типа.
Вопросы:
Какой подход лучше и чаще всего используется в компонентном проектировании? Что говорит практика? Есть предложения по внедрению Approach 4?
Спасибо.
Componentsв GameObjectsвыходит за рамки моего вопроса. Прочитайте статьи о компонентном подходе или задайте свой вопрос на этом сайте, если он вам интересен. Что вы думаете о GameSubsystemсовершенно неправильно.