¿Cuál es el papel de los "sistemas" en una arquitectura de entidad basada en componentes?

177

He estado leyendo mucho sobre componentes y sistemas de entidades y he pensado que la idea de que una entidad sea solo una ID es bastante interesante.

Sin embargo, no sé cómo funciona esto completamente con el aspecto de componentes o el aspecto de sistemas. Un componente es solo un objeto de datos administrado por algún sistema relevante. Un sistema de colisión utiliza algunos componentes BoundsComponent junto con una estructura de datos espaciales para determinar si se han producido colisiones.

Todo bien hasta ahora, pero ¿qué pasa si varios sistemas necesitan acceso al mismo componente? ¿Dónde deberían vivir los datos? Un sistema de entrada podría modificar un BoundsComponent de una entidad, pero los sistemas físicos necesitan acceso al mismo componente que algunos sistemas de renderizado.

Además, ¿cómo se construyen las entidades? Una de las ventajas sobre las que he leído mucho es la flexibilidad en la construcción de entidades. ¿Están los sistemas intrínsecamente vinculados a un componente? Si quiero introducir algún componente nuevo, ¿también tengo que introducir un nuevo sistema o modificar uno existente?

Otra cosa que he leído a menudo es que el "tipo" de una entidad se infiere por los componentes que tiene. Si mi entidad es solo una identificación, ¿cómo puedo saber que mi entidad de robot necesita ser movida o renderizada y, por lo tanto, modificada por algún sistema?

¡Perdón por la larga publicación (o al menos así parece desde la pantalla de mi teléfono)!

bio595
fuente

Respuestas:

336

Hay una multitud de formas de representar e implementar sistemas de componentes de entidad, pero aquí hay una explicación de una manera. Tenga en cuenta que no existe una definición concreta de arquitecturas de entidad / componente / sistema, por lo que esta es solo una implementación.

Voy a presentar una analogía para las arquitecturas de entidad / componente / sistema que podrían ayudar. Pensemos en una entidad como una clave.

La entidad

Clave de entidad

Las llaves también tienen dientes (azul oscuro). Los dientes de nuestra clave de entidad son los componentes que la componen. Puede distinguir las entidades por su ID, incluso si tienen los mismos dientes. Entonces, ¿en qué encajan las llaves? Cabellos. Las cerraduras son nuestros sistemas. Por ejemplo, un sistema de movimiento.

El sistema

Bloqueo del sistema de movimiento

El bloqueo solo funciona si nuestra llave tiene dientes tanto para la posición como para la velocidad. Este sistema solo procesa entidades que tienen una posición y una velocidad. Hay varias formas de configurar cómo estos sistemas reconocen qué entidades procesar, pero una es usar a long. Cada bit está reservado para un tipo de componente. Para nuestro ejemplo, supongamos un tipo de 4 bits en lugar de una longitud de 64 bits. Nuestra entidad de ejemplo tendría todos los componentes disponibles. Entonces su clave sería 1111. Entonces, el sistema está buscando cualquier entidad que tenga un 11--. (Al -representante no le importa, porque al movimiento no le importa si hay un sprite o salud). Puede verificar una entidad con una ANDoperación simple . Entonces nuestra entidad coincide con if ((1111 & 1100) == 1100). Si te perdí allí, mira más sobre las operaciones bit a bit .

Como puede ver, los sistemas tienen acceso a recursos externos. Pueden acceder a la hora, gráficos, sonido, etc. Son simplemente pequeños procesadores que toman una clave a la vez y procesan datos. Usted ve que el sistema de movimiento toma la velocidad, el tiempo delta y la posición; luego hace algunos cálculos y almacena el resultado nuevamente en su posición.

Las claves de entidad son realmente fáciles de generar. Puede agregarlos o eliminarlos a voluntad. A la entidad no le importa, es solo una forma de agrupar y mantener los componentes. Los componentes no tienen interdependencia. Lo más cerca que los componentes se relacionan entre sí es cuando un sistema opera en ellos y usa datos de uno para actualizar otro, como nuestro ejemplo de movimiento.

Echemos un vistazo a otro sistema para ayudar a solidificar la idea:

Sistema de dibujo de bloqueo

Este es nuestro sistema de dibujo. Busca componentes que coincidan 1-1-. Esta entidad coincide porque: ((1111 & 1010) == 1010)Además, puede ver que este sistema genera información en la pantalla, dibujando el sprite de la entidad en su posición.

De acuerdo, uno más. Veamos otra entidad y veamos cómo podría encajar en nuestro ejemplo hasta ahora.

Clave de entidad no movible

Como puede ver, esta entidad tiene menos componentes unidos. Al observar los componentes que tiene, parece que podría ser un elemento estático como una roca. Solo tiene una posición y un sprite. No se moverá y no se verá afectado por ningún cambio de salud. Esta entidad produciría una clave de 1010. Entonces, ¿qué sistemas operan en esta entidad? Vamos a revisar:

Contra nuestro sistema de movimiento: ((1010 & 1100) != 1100)No. Parece que el sistema de movimiento no se preocupa por esta entidad, porque no tiene los componentes necesarios.

Contra nuestro sistema de dibujo: ((1010 & 1010) == 1010)Oye, eso es un partido. Esta entidad será operada por el sistema de dibujo. El sistema de dibujo dibujará el sprite en la posición definida.


Esperemos que pueda ver lo fácil que sería agregar ahora otro sistema que tome nuestros componentes y los opere. Permítanme asegurarme de haber respondido sus preguntas:

¿Qué pasa si varios sistemas necesitan acceso al mismo componente? ¿Dónde deberían vivir los datos?

Por lo general, los sistemas funcionan uno tras otro. Procesan todas las entidades que coinciden con sus requisitos, luego el siguiente sistema hace lo mismo y así sucesivamente. Los datos viven con la entidad. No debería haber nada almacenado en el sistema, es solo una cerradura que se activa, la clave es donde permanece la información y se mueve de una cerradura a otra.

¿Cómo se construyen las entidades? ¿Están los sistemas intrínsecamente vinculados a un componente? Si quiero introducir algún componente nuevo, ¿también tengo que introducir un nuevo sistema o modificar uno existente?

Las entidades son solo bolsas de componentes. Tienen una identificación única y una lista de componentes. Los sistemas solo están vinculados a componentes de la manera descrita anteriormente. Puede tener componentes sin sistemas que operen en ellos, pero eso no tiene sentido. Del mismo modo, puede tener sistemas que buscan componentes que ninguna entidad tiene. Eso es menos inútil, porque pueden estar esperando que se cree una entidad que coincida con su bloqueo. Entonces, sí, si introduce un nuevo componente, desearía crear un sistema que utilice ese componente. De lo contrario, solo está agregando dientes a su llave para una cerradura que no existe.

Si mi entidad es solo una identificación, ¿cómo puedo saber que mi entidad de robot necesita ser movida o renderizada y, por lo tanto, modificada por algún sistema?

Creo que respondo esto con la idea de una longclave que define los componentes contenidos en una entidad. Lo sabes porque la llave se ajusta a la cerradura.

¡Uf! ¡Esa fue una publicación larga! (O al menos así parece desde mi monitor grande).

MichaelHouse
fuente
23
Esta analogía clave es realmente útil para comprender toda la idea ahora. ¡Brillante idea! Lol en tu último párrafo :)
bio595
16
+1 Para la mejor y mejor explicación del sistema entidad-componente que he visto. : O!
knight666
77
-1 de mí, no porque este sea un mal enfoque, sino porque está siendo retratado como EL enfoque. Sin embargo, hay muchos sistemas donde no hay separación de componentes y servicios (por ejemplo, en Unity), y hay formas más simples para que los sistemas sepan qué entidades procesar (solo agréguelas cuando se cree la entidad).
Kylotan
37
@Kylotan Yo digo " Hay varias formas de configurar cómo estos sistemas reconocen qué entidades procesar, pero una es usar along " . Además, generalmente reservo el voto negativo para las respuestas que no son útiles (como el texto emergente dice). Creo que pasaría mucho tiempo votando si lo hiciera por todas las respuestas que no cubrían el 100% de los temas que están abordando.
MichaelHouse