Я создаю компонент на основе системы игры объекта . Некоторые советы:
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
совершенно неправильно.Ответы:
Дверь № 3 ... Компонент регистрируется в GameSubsystem (s)
Компонент находится на месте, чтобы абстрагироваться от самого GameObject. Каким-то образом где-то действительно нужно взаимодействовать с подсистемами, и это компонент и его назначение.
Муфта на самом деле не плохая вещь в этом случае.
В этом случае производительность в основном требуется, если вы ожидаете какой-либо сложности в вашей системе, вы просто не можете позволить себе подходы стиля поиска других опций.
Наконец, если одна подсистема должна реагировать на другую (рендерер, физика, аудио - все должно делать что-то, когда что-то происходит), компоненты могут облегчать это друг с другом через игровой объект и сохранять управляемость этого конкретного типа кросс-системной связи через компоненты.
источник