Я создаю компонентную систему игровых объектов . Несколько советов:
GameObject
- это просто список компонентов
. GameSubsystems
. Например, рендеринг, физика и т.д. Каждая GameSubsystem
содержит указатели на некоторые из Компонентов
. GameSubsystem
- очень мощная и гибкая абстракция: она представляет любой фрагмент (или аспект) игрового мира. Существует потребность в механизме регистрации компонентов
в ] GameSubsystems
(когда GameObject
создан и составлен). Есть 4 подхода :
Компонент
предлагается каждой GameSubsystem
. GameSubsystem
принимает решение, какие Компоненты
регистрировать (и как их организовать). Например, GameSubsystemRender может регистрировать компоненты для рендеринга. pro. Компоненты
ничего не знают о том, как они используются. Низкое сцепление. A. Мы можем добавить новую GameSubsystem
. Например, давайте добавим GameSubsystemTitles, который регистрирует все ComponentTitle и гарантирует, что каждый заголовок уникален и предоставляет интерфейс для запроса объектов по заголовку. Конечно, ComponentTitle не следует переписывать или наследовать в этом случае. B. Мы можем реорганизовать существующие GameSubsystems
. Например, GameSubsystemAudio, GameSubsystemRender, GameSubsystemParticleEmmiter могут быть объединены с GameSubsystemSpatial (для размещения всех аудио, эмиттера, компонентов рендеринга компонентов
в одной иерархии и использования преобразований по отношению к родительским).
con. Всесторонняя проверка. Очень неэффективно.
con. Подсистемы
знают о Компонентах
.
Подсистема
ищет Компоненты
определенных типов. pro. Лучшая производительность, чем в подходе 1
.
con. Подсистемы
все еще знают о Компонентах
.
Компонент
регистрируется в GameSubsystem (s)
. Во время компиляции мы знаем, что существует GameSubsystemRenderer, поэтому давайте s ComponentImageRender вызовет что-то вроде GameSubsystemRenderer :: register (ComponentRenderBase *). Компонент
подписывается на событие «обновление» (отправленное GameSubsystem (s)
). pro. Производительность. Никаких лишних проверок, как в подходе 1
и подходе 2
.
con. Компоненты
плохо связаны с GameSubsystems
.
GameState
(содержащий GameSubsystems
) может реализовывать registerComponent (Component *). pro. Компоненты
и GameSubystems
ничего не знают друг о друге.
con. В C ++ это выглядело бы как уродливый и медленный typeid-switch.
Вопросы:
Наблюдатель шаблон. Компонент
подписывается на событие «обновление» (отправленное GameSubsystem (s)
).
pro. Производительность. Никаких лишних проверок, как в подходе 1
и подходе 2
.
con. Компоненты
плохо связаны с GameSubsystems
.
GameState
(содержащий GameSubsystems
) может реализовывать registerComponent (Component *). pro. Компоненты
и GameSubystems
ничего не знают друг о друге.
con. В C ++ это выглядело бы как уродливый и медленный typeid-switch.
Вопросы:
Наблюдатель шаблон. Компонент
подписывается на событие «обновление» (отправленное GameSubsystem (s)
).
pro. Производительность. Никаких лишних проверок, как в подходе 1
и подходе 2
.
con. Компоненты
плохо связаны с GameSubsystems
.
GameState
(содержащий GameSubsystems
) может реализовывать registerComponent (Component *). pro. Компоненты
и GameSubystems
ничего не знают друг о друге.
con. В C ++ это выглядело бы как уродливый и медленный typeid-switch.
Вопросы: событие (отправлено GameSubsystem (s)
).
pro. Производительность. Никаких лишних проверок, как в подходе 1
и подходе 2
.
con. Компоненты
плохо связаны с GameSubsystems
.
GameState
(содержащий GameSubsystems
) может реализовывать registerComponent (Component *). pro. Компоненты
и GameSubystems
ничего не знают друг о друге.
con. В C ++ это выглядело бы как уродливый и медленный typeid-switch.
Вопросы: событие (отправлено GameSubsystem (s)
).
pro. Производительность. Никаких лишних проверок, как в подходе 1
и подходе 2
.
con. Компоненты
плохо связаны с GameSubsystems
.
GameState
(содержащий GameSubsystems
) может реализовывать registerComponent (Component *). pro. Компоненты
и GameSubystems
ничего не знают друг о друге.
con. В C ++ это выглядело бы как уродливый и медленный typeid-switch.
Вопросы: Компоненты
плохо связаны с GameSubsystems
.
GameState
(содержащий GameSubsystems
) может реализовывать registerComponent (Component *). pro. Компоненты
и GameSubystems
ничего не знают друг о друге.
con. В C ++ это выглядело бы как уродливый и медленный typeid-switch.
Вопросы: Компоненты
плохо связаны с GameSubsystems
.
GameState
(содержащий GameSubsystems
) может реализовывать registerComponent (Component *). pro. Компоненты
и GameSubystems
ничего не знают друг о друге.
con. В C ++ это выглядело бы как уродливый и медленный typeid-switch.
Вопросы:
Какой подход лучше и чаще всего используется в компонентном дизайне? Что говорит практика? Есть предложения по (управляемой данными) реализации подхода 4
?
Спасибо.