Estoy creando un sistema de objetos de juego basado en componentes . Algunos consejos:
GameObjectes simplemente una lista deComponents.- Hay
GameSubsystems. Por ejemplo, renderizado, física, etc. Cada unoGameSubsystemcontiene punteros a algunos deComponents.GameSubsystemes 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 Componentsen GameSubsystems(cuando GameObjectse crea y se compone). Hay 4 enfoques :
- 1: Patrón de cadena de responsabilidad . Todos
Componentse ofrecen a todosGameSubsystem.GameSubsystemtoma una decisión sobre quéComponentsregistrar (y cómo organizarlos). Por ejemplo, GameSubsystemRender puede registrar Componentes Renderables.
Pro. ComponentsNo 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 Componentsen la misma jerarquía y usar transformaciones relativas a los padres).
estafa. Cheque de todos a todos. Muy ineficiente.
estafa. Subsystemssaber acerca Components.
- 2: Cada uno
SubsystembuscaComponentstipos específicos.
Pro. Mejor rendimiento que en Approach 1.
estafa. SubsystemsTodavía lo sé Components.
- 3: se
Componentregistra 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. Componentsestán mal acoplados con GameSubsystems.
- 4: patrón de mediador .
GameState(que contieneGameSubsystems) puede implementar registerComponent (Component *).
Pro. Componentsy GameSubystemsno 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

ComponentsenGameObjectsestá 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 piensasGameSubsystemestá 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