Estou criando um sistema de objetos de jogo baseado em componentes . Algumas dicas:
GameObject
é simplesmente uma lista deComponents
.- Existem
GameSubsystems
. Por exemplo, renderização, física etc. Cada umGameSubsystem
contém ponteiros para alguns delesComponents
.GameSubsystem
é uma abstração muito poderosa e flexível: representa qualquer fatia (ou aspecto) do mundo do jogo.
Há uma necessidade em um mecanismo de registrar Components
em GameSubsystems
(quando GameObject
é criado e composto). Existem 4 abordagens :
- 1: Padrão de cadeia de responsabilidade . Tudo
Component
é oferecido a todosGameSubsystem
.GameSubsystem
toma uma decisão sobre qualComponents
registro (e como organizá-los). Por exemplo, GameSubsystemRender pode registrar componentes renderizáveis.
pró. Components
não sabem nada sobre como eles são usados. Baixo acoplamento. A. Nós podemos adicionar novos GameSubsystem
. Por exemplo, vamos adicionar o GameSubsystemTitles que registra todo o ComponentTitle e garante que cada título seja exclusivo e fornece interface para consultar objetos por título. Obviamente, ComponentTitle não deve ser reescrito ou herdado neste caso. B. Nós podemos reorganizar os existentes GameSubsystems
. Por exemplo, GameSubsystemAudio, GameSubsystemRender, GameSubsystemParticleEmmiter podem ser mesclados em GameSubsystemSpatial (para colocar todo o áudio, emmiter, renderizar Components
na mesma hierarquia e usar transformações relativas aos pais).
vigarista. Cheque de todos para todos. Muito ineficiente.
vigarista. Subsystems
conhecer Components
.
- 2: Cada um
Subsystem
procura porComponents
tipos específicos.
pró. Melhor desempenho do que em Approach 1
.
vigarista. Subsystems
ainda conhece Components
.
- 3:
Component
registra-se emGameSubsystem(s)
. Sabemos em tempo de compilação que existe um GameSubsystemRenderer, então vamos ComponentImageRender chamará algo como GameSubsystemRenderer :: register (ComponentRenderBase *).
pró. Atuação. Sem verificações desnecessárias como em Approach 1
.
vigarista. Components
estão mal associados GameSubsystems
.
- 4: Padrão do mediador .
GameState
(que contémGameSubsystems
) pode implementar registerComponent (Component *).
pró. Components
e GameSubystems
não sabem nada um do outro.
vigarista. Em C ++, pareceria um switch tipo-tipo feio e lento.
Perguntas:
Qual abordagem é melhor e mais usada no design baseado em componentes? O que a prática diz? Alguma sugestão sobre a implementação de Approach 4
?
Obrigado.
fonte
Components
emGameObjects
está fora do escopo da minha pergunta. Leia artigos sobre a abordagem baseada em componentes ou faça sua própria pergunta neste site, se estiver interessado nela. O que você pensaGameSubsystem
é totalmente errado.Respostas:
Número da porta 3 ... O componente se registra no GameSubsystem (s)
O componente está no lugar para manter o acoplamento abstraído do próprio GameObject. De alguma forma, em algum lugar algo de fato precisa interagir com os subsistemas e esse é o componente e seu objetivo.
O acoplamento não é realmente uma coisa ruim neste caso.
O desempenho é essencialmente necessário nesse caso, se você espera ter alguma complexidade em seu sistema, você simplesmente não pode permitir as abordagens de estilo de pesquisa das outras opções.
Finalmente, se um subsistema precisa ser reativo a outro (renderizador, física, áudio precisam fazer coisas quando algo acontece), os componentes podem facilitar isso entre si através do objeto de jogo e manter esse tipo específico de acoplamento entre sistemas gerenciado por meio do componentes.
fonte