Зарегистрировать компоненты игрового объекта в игровых подсистемах? (Дизайн игровых объектов на основе компонентов)

Я создаю компонентную систему игровых объектов . Несколько советов:

  1. GameObject - это просто список компонентов .
  2. Есть GameSubsystems . Например, рендеринг, физика и т.д. Каждая GameSubsystem содержит указатели на некоторые из Компонентов . GameSubsystem - очень мощная и гибкая абстракция: она представляет любой фрагмент (или аспект) игрового мира.

Существует потребность в механизме регистрации компонентов в ] GameSubsystems (когда GameObject создан и составлен). Есть 4 подхода :


  • 1: Схема цепочки ответственности . Каждый Компонент предлагается каждой GameSubsystem . GameSubsystem принимает решение, какие Компоненты регистрировать (и как их организовать). Например, GameSubsystemRender может регистрировать компоненты для рендеринга.

pro. Компоненты ничего не знают о том, как они используются. Низкое сцепление. A. Мы можем добавить новую GameSubsystem . Например, давайте добавим GameSubsystemTitles, который регистрирует все ComponentTitle и гарантирует, что каждый заголовок уникален и предоставляет интерфейс для запроса объектов по заголовку. Конечно, ComponentTitle не следует переписывать или наследовать в этом случае. B. Мы можем реорганизовать существующие GameSubsystems . Например, GameSubsystemAudio, GameSubsystemRender, GameSubsystemParticleEmmiter могут быть объединены с GameSubsystemSpatial (для размещения всех аудио, эмиттера, компонентов рендеринга компонентов в одной иерархии и использования преобразований по отношению к родительским).

con. Всесторонняя проверка. Очень неэффективно.

con. Подсистемы знают о Компонентах .


  • 2: Каждая Подсистема ищет Компоненты определенных типов.

pro. Лучшая производительность, чем в подходе 1 .

con. Подсистемы все еще знают о Компонентах .


  • 3: Компонент регистрируется в GameSubsystem (s) . Во время компиляции мы знаем, что существует GameSubsystemRenderer, поэтому давайте s ComponentImageRender вызовет что-то вроде GameSubsystemRenderer :: register (ComponentRenderBase *).
    шаблон Observer . Компонент подписывается на событие «обновление» (отправленное GameSubsystem (s) ).

pro. Производительность. Никаких лишних проверок, как в подходе 1 и подходе 2 .

con. Компоненты плохо связаны с GameSubsystems .


pro. Компоненты и GameSubystems ничего не знают друг о друге.

con. В C ++ это выглядело бы как уродливый и медленный typeid-switch.


Вопросы:
Наблюдатель шаблон. Компонент подписывается на событие «обновление» (отправленное GameSubsystem (s) ).

pro. Производительность. Никаких лишних проверок, как в подходе 1 и подходе 2 .

con. Компоненты плохо связаны с GameSubsystems .


pro. Компоненты и GameSubystems ничего не знают друг о друге.

con. В C ++ это выглядело бы как уродливый и медленный typeid-switch.


Вопросы:
Наблюдатель шаблон. Компонент подписывается на событие «обновление» (отправленное GameSubsystem (s) ).

pro. Производительность. Никаких лишних проверок, как в подходе 1 и подходе 2 .

con. Компоненты плохо связаны с GameSubsystems .


pro. Компоненты и GameSubystems ничего не знают друг о друге.

con. В C ++ это выглядело бы как уродливый и медленный typeid-switch.


Вопросы: событие (отправлено GameSubsystem (s) ).

pro. Производительность. Никаких лишних проверок, как в подходе 1 и подходе 2 .

con. Компоненты плохо связаны с GameSubsystems .


pro. Компоненты и GameSubystems ничего не знают друг о друге.

con. В C ++ это выглядело бы как уродливый и медленный typeid-switch.


Вопросы: событие (отправлено GameSubsystem (s) ).

pro. Производительность. Никаких лишних проверок, как в подходе 1 и подходе 2 .

con. Компоненты плохо связаны с GameSubsystems .


pro. Компоненты и GameSubystems ничего не знают друг о друге.

con. В C ++ это выглядело бы как уродливый и медленный typeid-switch.


Вопросы: Компоненты плохо связаны с GameSubsystems .


pro. Компоненты и GameSubystems ничего не знают друг о друге.

con. В C ++ это выглядело бы как уродливый и медленный typeid-switch.


Вопросы: Компоненты плохо связаны с GameSubsystems .


pro. Компоненты и GameSubystems ничего не знают друг о друге.

con. В C ++ это выглядело бы как уродливый и медленный typeid-switch.


Вопросы: Какой подход лучше и чаще всего используется в компонентном дизайне? Что говорит практика? Есть предложения по (управляемой данными) реализации подхода 4 ?

Спасибо.

7
задан Community 23 May 2017 в 12:09
поделиться