¿Cómo se almacenarían datos de contexto global en un sistema de componentes de entidad?

10

Mi pregunta es esta:

¿Cómo se almacenarían los datos del contexto global, es decir. información de datos mundiales, hora mundial actual, etc. en un sistema de componentes de entidad?

Estoy pensando en trabajar para construir un juego de simulación mundial de estilo abierto Dwarf Fortress en C ++. He creado un motor de juego de estilo de componente de entidad solo por diversión, y actualmente estoy tratando de descubrir cómo voy a trabajar en todas las características que quiero. Además del juego estándar (renderización, física, datos de componentes específicos de la entidad, etc.), también me gustaría tener algunos datos contextuales globales a los que todos los sistemas relevantes tendrían acceso (es decir, los datos mundiales como el año en que es actualmente , si está ocurriendo el calentamiento global, cualquier tipo de cosa que sea relevante para simular un mundo). Originalmente había pensado en hacer un componente "mundial", pero esto parece inútil y difícil si muchos sistemas diferentes necesitan acceder a estos datos lógicamente "globales".

¿Tendría sentido tener un componente "mundial" o debería almacenar estos datos de otra manera?

También había pensado simplemente en hacer que estos datos fueran globales, dando así acceso a cualquier sistema que quisiera usarlos; Parece una violación de los principios de entidad-componente en general, y tal vez desordenado por otras razones, pero pensé que realmente podría funcionar.

La otra cosa en la que pensé sería incorporar datos relevantes del contexto mundial directamente en los propios sistemas. Por ejemplo, si tuviera un AgeSystem"envejecimiento" de todas las entidades que tienen un getsWeakerAsTimePassescomponente o no, entonces este sistema podría almacenar datos de tiempo relevantes para el mundo directamente como datos de miembros que usaría para calcular el paso del tiempo y cuánto envejecer y debilitar a las personas, etc. Esta tercera opción era mi menos favorita, pero algo que se me había ocurrido en una lluvia de ideas.

¿Alguien puede aconsejar?

Awesomania
fuente
3
La justificación de los votos negativos es cortés y útil no solo para el OP, sino también para otros usuarios.
MichaelHouse
2
Has construido un martillo y ahora todo parece un clavo. Le doy permiso para usar más que solo ECS para retener y manipular datos en su programa porque no todo es un clavo.
Patrick Hughes

Respuestas:

10

Cualquier forma que funcione es una manera que funciona. Eso suena sarcástico, pero realmente, tu juego es 1000 veces más importante que tu arquitectura. Elija cualquier enfoque que le guste y encuentre fácil de usar.

Los que he visto en juegos de envío reales (usando diseño basado en componentes, no ECS específicamente; nunca he visto ECS puro "en la naturaleza", aunque muchos diseños de componentes tienen elementos similares a ECS) incluyen:

  • Singletons
  • Objetos de "contexto" pasados ​​a componentes / sistemas que contienen referencias a todos los otros sistemas relevantes
  • Fábricas de componentes que pasan manijas del sistema a componentes individuales
  • Componentes que almacenan referencias a sistemas en la raíz de una jerarquía de objetos (solo en algunos juegos de Undball Unity)
  • Objetos singulares de "motor" pasados ​​a sistemas o componentes que contienen referencias a todos los demás sistemas
  • Sistemas de búsqueda de recursos basados ​​en cadenas (permitiéndole en C ++ hacer algo como handle<PhysicsSystem> = GetResource<PhysicsSystem>("/systems/physics"), sí, realmente)
  • Montones de datos globales y funciones libres de estilo C que operan en ellos
  • Espacios / subespacios y video acompañante

Todos trabajan Tengo quejas con algunos enfoques y un favorito obvio, pero todos se han utilizado para enviar juegos AAA. A veces, múltiples enfoques en un solo proyecto (más de 40-100 equipos de ingenieros tienden a crear códigos duplicados al azar, por desgracia).

Sean Middleditch
fuente
2
Tengo curiosidad por saber cuál es tu favorito obvio.
cenizas999
Los enlaces que proporcioné son a mis diapositivas y un video de mí dando una charla sobre el tema, si es alguna pista. :)
Sean Middleditch
Ah, entonces tu favorito es espacios / subespacios entonces. :)
cenizas999
Gran respuesta. Creo que tengo algo resuelto, y en realidad seguí adelante e incorporé el concepto de "espacios / subespacios" en mi plan de juego.
Awesomania