Estoy creando un component-based game object system. Algunos consejos:¿Registrar componentes de objetos de juego en los subsistemas del juego? (Diseño de objeto de juego basado en componentes)
GameObject
es simplemente una lista deComponents
.- Hay
GameSubsystems
. Por ejemplo, renderizado, física, etc. CadaGameSubsystem
contiene punteros a algunos deComponents
.GameSubsystem
es una abstracción muy poderosa y flexible: representa cualquier sector (o aspecto) del mundo del juego.
Hay una necesidad de un mecanismo de registro de Components
en GameSubsystems
(cuando se crea y compuesto GameObject
). Hay 4 se aproxima:
- 1: Chain of responsibility patrón. Cada
Component
se ofrece a cadaGameSubsystem
.GameSubsystem
toma una decisión queComponents
para registrarse (y cómo organizarlos). Por ejemplo, GameSubsystemRender puede registrar componentes de Renderable.
pro. Components
no saben nada sobre cómo se usan. Bajo acoplamiento A. Podemos agregar el nuevo GameSubsystem
. Por ejemplo, agreguemos GameSubsystemTitles que registre todos los ComponentTitle y garantice que cada título sea único y proporcione una interfaz para buscar objetos por título. Por supuesto, ComponentTitle no se debe reescribir o heredar en este caso. B. Podemos reorganizar el existente GameSubsystems
. Por ejemplo, GameSubsystemAudio, GameSubsystemRender, GameSubsystemParticleEmmiter se pueden fusionar en GameSubsystemSpatial (para colocar todo el audio, emmiter, renderizar Components
en la misma jerarquía y usar transformaciones relativas a los padres).
con. Control de todos los días. Muy ineficiente.
con. Subsystems
saber Components
.
- 2: Cada
Subsystem
búsquedas deComponents
de tipos específicos.
pro. Mejor rendimiento que en Approach 1
.
con. Subsystems
todavía saben sobre Components
.
- 3:
Component
registra a sí mismo enGameSubsystem(s)
. Sabemos en tiempo de compilación que hay GameSubsystemRenderer, así que vamos a ComponentImageRender a llamar a algo como GameSubsystemRenderer :: register (ComponentRenderBase *).
Observer patrón.Component
se suscribe al evento "actualizar" (enviado porGameSubsystem(s)
).
pro. Actuación.Sin controles innecesarios como en Approach 1
y Approach 2
.
con. Components
están mal acoplados con GameSubsystems
.
- 4: Mediator patrón.
GameState
(que contieneGameSubsystems
) puede implementar registerComponent (Component *).
pro. Components
y GameSubystems
no saben nada el uno del otro.
con. En C++ se vería como un interruptor de tipo de letra feo y lento.
Preguntas: qué método es mejor y sobre todo utilizada en el diseño basado en componentes? ¿Qué práctica dice? ¿Alguna sugerencia sobre la implementación (basada en datos) de Approach 4
?
Gracias.
Estoy de acuerdo con usted en que estas ventajas son muy valiosas. Pero el primero tiene otro lado: no hay reutilización de 'Componente' entre proyectos (con diferentes conjuntos de' Subsistemas').La recomposición de subsistemas en un solo proyecto se convierte en un problema, también. Puede haber cientos de 'Componentes', reescribirlos a todos es una tarea tediosa. Creo que esa segunda ventaja se puede alcanzar en otros enfoques, también. –
Estoy de acuerdo con tu punto. En un momento me presentaron el diseño CBGOS no tanto como quisiera. Pero el trabajo que encontré para hacer frente a esto me llevó a las siguientes consideraciones: * 1. * Diseñar las interfaces del subsistema de la manera más abstracta para que el conjunto de subsistemas cambie ligeramente en los diferentes proyectos. * 2. * Prefiere la interacción por mensaje entre componentes por encima de todo y corta las dependencias de interfaz donde sea posible. – Keynslug
Puede funcionar. Conocí gente en los foros de gamedev.net que también usan este enfoque. –