Estoy creando un sistema de objetos de juego basado en componentes . Algunos consejos:
GameObject
es simplemente una lista deComponents
.- Hay
GameSubsystems
. Por ejemplo, renderizado, física, etc. Cada unoGameSubsystem
contiene punteros a algunos deComponents
.GameSubsystem
es una abstracción muy poderosa y flexible: representa cualquier porción (o aspecto) del mundo del juego.
Existe la necesidad de un mecanismo de registro Components
en GameSubsystems
(cuando GameObject
se crea y se compone). Hay 4 enfoques :
- 1: Patrón de cadena de responsabilidad . Todos
Component
se ofrecen a todosGameSubsystem
.GameSubsystem
toma una decisión sobre quéComponents
registrar (y cómo organizarlos). Por ejemplo, GameSubsystemRender puede registrar Componentes Renderables.
Pro. Components
No sé nada acerca de cómo se usan. Bajo acoplamiento. A. Podemos agregar nuevos GameSubsystem
. Por ejemplo, agreguemos GameSubsystemTitles que registra todo ComponentTitle y garantiza que cada título es único y proporciona una interfaz para buscar objetos por título. Por supuesto, ComponentTitle no debe reescribirse o heredarse en este caso. B. Podemos reorganizar los existentes GameSubsystems
. Por ejemplo, GameSubsystemAudio, GameSubsystemRender, GameSubsystemParticleEmmiter se pueden combinar en GameSubsystemSpatial (para colocar todo el audio, el emisor, el render Components
en la misma jerarquía y usar transformaciones relativas a los padres).
estafa. Cheque de todos a todos. Muy ineficiente.
estafa. Subsystems
saber acerca Components
.
- 2: Cada uno
Subsystem
buscaComponents
tipos específicos.
Pro. Mejor rendimiento que en Approach 1
.
estafa. Subsystems
Todavía lo sé Components
.
- 3: se
Component
registra enGameSubsystem(s)
. Sabemos en tiempo de compilación que hay un GameSubsystemRenderer, así que ComponentImageRender llamará a algo como GameSubsystemRenderer :: register (ComponentRenderBase *).
Pro. Actuación. No hay controles innecesarios como en Approach 1
.
estafa. Components
están mal acoplados con GameSubsystems
.
- 4: patrón de mediador .
GameState
(que contieneGameSubsystems
) puede implementar registerComponent (Component *).
Pro. Components
y GameSubystems
no saben nada el uno del otro.
estafa. En C ++ se vería como un interruptor typeid feo y lento.
Preguntas:
¿Qué enfoque es mejor y se usa principalmente en el diseño basado en componentes? ¿Qué dice la práctica? ¿Alguna sugerencia sobre la implementación de Approach 4
?
Gracias.
fuente
Components
enGameObjects
está fuera del alcance de mi pregunta. Lea artículos sobre el enfoque basado en componentes o haga su propia pregunta en este sitio si está interesado en él. Lo que piensasGameSubsystem
está totalmente mal.Respuestas:
Puerta número 3 ... El componente se registra en GameSubsystem (s)
El componente está en su lugar para mantener el acoplamiento abstraído del propio GameObject. De alguna manera, en algún lugar, de hecho, algo necesita interactuar con los subsistemas y este es el componente y su propósito.
El acoplamiento no es realmente algo malo en este caso.
El rendimiento se requiere esencialmente en este caso si espera tener alguna complejidad en su sistema, simplemente no puede permitirse los enfoques de estilo de búsqueda de las otras opciones.
Finalmente, si un subsistema necesita ser reactivo a otro (el renderizador, la física, el audio deben hacer cosas cuando algo sucede), los componentes pueden facilitar esto entre sí a través del objeto del juego y mantener este tipo particular de acoplamiento cruzado del sistema manejable a través del componentes.
fuente