
El sistema de componentes de entidades ( ECS , por sus siglas en inglés) es un patrón arquitectónico de software . Un ECS consta de entidades compuestas por componentes de datos, junto con sistemas que operan sobre dichos componentes. Se asocia principalmente con el desarrollo de videojuegos para la representación de objetos del mundo del juego.
ECS prioriza la composición sobre la herencia . Cada entidad se define no por una jerarquía de tipos, sino por los componentes asociados. Los sistemas actúan globalmente sobre todas las entidades que poseen los componentes necesarios. Por ejemplo, un sistema alimentario podría iterar sobre cada entidad con un componente relevante que registre el hambre y actuar sobre ellas para alejarlas ligeramente de la saciedad a intervalos regulares. Las entidades que carecen de dicho componente, como el terreno o los objetos, serían ignoradas por el sistema alimentario.
Debido a una ambigüedad en el idioma inglés, una interpretación del nombre es que un ECS es un sistema compuesto por entidades y componentes. En la charla de 2002 en la GDC, [ 1 ] [ 2 ] Scott Bilas comparó un sistema de objetos de C++ con su nuevo sistema de componentes personalizado. Esto concuerda con el uso tradicional de términos de sistema en la ingeniería de sistemas en general , tomando como ejemplos el Sistema de Objetos de Common Lisp y el sistema de tipos .
Aunque se encuentra principalmente en el desarrollo de videojuegos , el ECS puede ser útil en otros dominios, [ 3 ] como en simuladores de robótica como Gazebo. [ 4 ]
Características
ECS combina ideas ortogonales y bien establecidas de la informática general y la teoría de lenguajes de programación . Por ejemplo, los componentes pueden considerarse un modismo mixin en diversos lenguajes de programación. Los componentes constituyen un caso especializado dentro del enfoque de delegación general y el protocolo de meta-objetos . Es decir, cualquier sistema completo de objetos componentes puede expresarse con las plantillas y el modelo de empatía dentro de la visión del Tratado de Orlando [ 5 ] sobre la programación orientada a objetos .
- Entidad
- Una entidad representa un objeto de propósito general. En el contexto de un motor de juego, por ejemplo, cada objeto de juego básico se representa como una entidad. Normalmente, solo consta de un identificador único. Las implementaciones suelen utilizar un número entero simple para esto. [ 6 ]
- Componente
- Un componente caracteriza a una entidad como poseedora de un aspecto particular, y (el componente) contiene los datos necesarios para modelar ese aspecto. Por ejemplo, cada objeto del juego que puede recibir daño podría tener un componente de Salud asociado a su entidad. Las implementaciones suelen utilizar estructuras , clases o matrices asociativas . [ 6 ]
- Sistema
- Un sistema es un proceso que actúa sobre todas las entidades con los componentes deseados. Por ejemplo, un sistema físico puede consultar entidades que tengan componentes de masa, velocidad y posición, iterar sobre los resultados y realizar cálculos físicos para cada entidad utilizando el conjunto de componentes.
El comportamiento de una entidad puede modificarse en tiempo de ejecución mediante sistemas que añaden, eliminan o modifican componentes. Esto elimina los problemas de ambigüedad propios de las jerarquías de herencia extensas y complejas , frecuentes en las técnicas de programación orientada a objetos, que resultan difíciles de comprender, mantener y ampliar. Los enfoques ECS comunes son altamente compatibles con las técnicas de diseño orientadas a datos y, a menudo, se combinan con ellas. Los datos de todas las instancias de un componente se almacenan de forma contigua en la memoria física, lo que permite un acceso eficiente a la memoria para sistemas que operan con múltiples entidades.
Historia
En 1963, el Sketchpad de Ivan Sutherland almacenaba los elementos visuales de un dibujo mediante una forma primitiva de un ECS (Sistema de Control Electrónico). En lugar de encapsular los puntos en diferentes objetos (por ejemplo, líneas, círculos, rectángulos), los puntos se almacenaban en un búfer circular , y los elementos visuales solo hacían referencia a ellos. Al mover un punto, esto permitía actualizar todas las formas y restricciones que lo utilizaban. [ 7 ]
En 1998, Thief: The Dark Project fue pionero en un ECS. [ 8 ] El motor se utilizó posteriormente para su secuela, así como para System Shock 2 .
En 2002, Scott Bilas de Gas Powered Games ( Dungeon Siege ) dio una charla fundamental sobre ECS. [ 1 ] Esto inspiró numerosas implementaciones posteriores muy conocidas.
A principios de enero de 2007, Mick West, quien trabajó en la serie Tony Hawk, compartió sus experiencias sobre el proceso de adopción de ECS en Neversoft. [ 9 ]
También en 2007, el equipo que trabajaba en Operation Flashpoint: Dragon Rising experimentó con diseños ECS, incluidos aquellos inspirados en Bilas/ Dungeon Siege , y Adam Martin escribió más tarde un relato detallado del diseño ECS, [ 10 ] incluyendo definiciones de terminología y conceptos centrales. [ 11 ] En particular, el trabajo de Martin popularizó las ideas de los sistemas como un elemento de primera clase, las entidades como identificadores, los componentes como datos brutos y el código almacenado en sistemas, no en componentes o entidades.
En 2015, Apple Inc. presentó GameplayKit , un marco de API para el desarrollo de juegos para iOS , macOS y tvOS que incluye una implementación de ECS. [ 12 ]
En octubre de 2018 [ 13 ] la empresa Unity lanzó su demo de megaciudad que utilizaba una pila tecnológica construida sobre un ECS. El ECS de Unity funciona sobre una potente arquitectura optimizada conocida como DOTS, que "capacita a los creadores para escalar el procesamiento de una manera de alto rendimiento".
Variaciones
La estructura de datos de los diferentes sistemas de control empresarial (ECS) puede variar, al igual que la definición de los componentes, su relación con las entidades y la forma en que los sistemas acceden a los componentes de las entidades.
ECS de Martin
Adam Martin define en su serie de blogs lo que él considera un Sistema Entidad-Componente. [ 11 ]
Una entidad solo consta de un ID para acceder a los componentes. Es práctica común usar un ID único para cada entidad. Esto no es un requisito, pero tiene varias ventajas:
- Se puede hacer referencia a la entidad mediante su ID en lugar de un puntero . Esto es más robusto, ya que permite destruir la entidad sin dejar punteros colgantes.
- También resulta útil para guardar el estado externamente; cuando el estado se carga de nuevo, no es necesario reconstruir los punteros.
- Los datos se pueden reorganizar en la memoria según sea necesario, siempre y cuando los punteros se ajusten en consecuencia.
- Los identificadores de entidad se pueden utilizar al comunicarse a través de una red para identificar de forma unívoca a la entidad.
Algunas de estas ventajas también se pueden lograr utilizando punteros inteligentes .
Los componentes no contienen código de juego ( comportamiento ). No es necesario que estén ubicados físicamente junto con la entidad, pero deben ser fáciles de encontrar y acceder a través de ella.
"Cada sistema se ejecuta de forma continua (como si cada sistema tuviera su propio hilo privado) y realiza acciones globales sobre cada entidad que posea un componente o componentes que coincidan con la consulta de ese sistema."
El motor de juegos Unity
El diseño de Unity se basa en tablas, cada una con columnas de componentes. En este sistema, un tipo de entidad se define por los componentes que contiene. Para cada tipo de entidad , existe una tabla (denominada arquetipo ) con columnas de componentes que coinciden con los componentes utilizados en la entidad. Para acceder a una entidad específica, es necesario encontrar el arquetipo (tabla) correcto e indexar cada columna para obtener el componente correspondiente.
Patrones comunes en el uso de ECS
La forma habitual de transmitir datos entre sistemas consiste en almacenarlos en componentes, permitiendo que cada sistema acceda a ellos secuencialmente. Por ejemplo, la posición de un objeto se puede actualizar periódicamente. Esta posición es utilizada posteriormente por otros sistemas. Si se producen muchos eventos poco frecuentes, se necesitarán numerosos indicadores en uno o más componentes. Los sistemas deberán entonces monitorizar estos indicadores en cada iteración, lo que puede resultar ineficiente. Una solución podría ser utilizar el patrón observador . Todos los sistemas que dependen de un evento se suscriben a él. De esta forma, la acción derivada del evento se ejecutará únicamente cuando ocurra, sin necesidad de sondeo.
El ECS no tiene problemas con las dependencias comunes en la programación orientada a objetos, ya que los componentes son simples contenedores de datos y no tienen dependencias. Cada sistema normalmente consulta el conjunto de componentes que una entidad debe tener para que el sistema pueda operar sobre ella. Por ejemplo, un sistema de renderizado podría registrar el modelo, las transformaciones y los componentes dibujables. Al ejecutarse, el sistema aplicará su lógica a cualquier entidad que tenga todos esos componentes. Las demás entidades simplemente se omiten, sin necesidad de árboles de dependencia complejos. Sin embargo, esto puede ser un lugar donde se oculten errores, ya que propagar valores de un sistema a otro a través de componentes puede ser difícil de depurar. El ECS se puede usar cuando los datos no acoplados necesitan estar vinculados a un ciclo de vida determinado.
El ECS utiliza composición en lugar de árboles de herencia . Una entidad suele estar compuesta por un ID y una lista de componentes asociados. Cualquier objeto del juego se puede crear añadiendo los componentes correctos a una entidad. Esto permite al desarrollador añadir fácilmente funcionalidades a una entidad, sin problemas de dependencia. Por ejemplo, a una entidad de jugador se le podría añadir un componente de bala , que cumpliría los requisitos para ser manipulado por un sistema bulletHandler , lo que podría provocar que la bala dañara otros objetos al impactar contra ellos.
Muchos desarrolladores de juegos, como Adam Martin, han elogiado las ventajas de usar ECS para almacenar el estado del juego. Un buen ejemplo son las publicaciones del blog de Richard Lord, donde analiza las ventajas y explica por qué los sistemas de almacenamiento de datos de juegos diseñados con ECS son tan útiles. [ 14 ]
Véase también
Notas
Referencias
- 1 2 Bilas, Scott. "Un sistema de objetos de juego basado en datos" (PDF) . Archivado (PDF) del original el 18 de septiembre de 2013. Recuperado el 25 de diciembre de 2013 .
- ↑ Bilas, Scott. "Un sistema de audio de objetos de juego basado en datos" . Archivado del original el 18 de abril de 2025. Recuperado el 18 de abril de 2025 .
- ↑ Romeo, Vittorio. (2016): Análisis de técnicas de codificación de entidades, diseño e implementación de una biblioteca C++14 multihilo de tiempo de compilación Entity-Component-System 10.13140/RG.2.1.1307.4165. ( https://www.researchgate.net/publication/305730566_Analysis_of_entity_encoding_techniques_design_and_implementation_of_a_multithreaded_compile-time_Entity-Component-System_C14_library )
- ↑ Open Robotics. "Referencia de la API de Gazebo Sim: Tutoriales: Terminología" . Consultado el 10 de septiembre de 2025 .
- ↑ Lynn Andrea Stein, Henry Liberman, David Ungar: Una visión compartida del intercambio: El Tratado de Orlando . En: Won Kim, Frederick H. Lochovsky (Eds.): Conceptos, bases de datos y aplicaciones orientadas a objetos. ACM Press, Nueva York, 1989, cap. 3, págs. 31-48. ISBN 0-201-14410-7( Archivado en línea el 7 de octubre de 2016 en Wayback Machine )
- 1 2 "Entity Systems Wiki" . Archivado del original el 31 de diciembre de 2019. Recuperado el 31 de diciembre de 2019 .
- ↑ Sutherland, Ivan Edward (enero de 1963). "Sketchpad: Un sistema de comunicación gráfica hombre-máquina (cortesía del Laboratorio de Computación de la Universidad de Cambridge UCAM-CL-TR-574, septiembre de 2003)" . Instituto Tecnológico de Massachusetts . Consultado el 26 de diciembre de 2006 .
- ↑ "El patrón de diseño desconocido" . 11 de marzo de 2021.
- ↑ "Evoluciona tu jerarquía" . 5 de enero de 2007.
- ↑ Martin, Adam. "Los sistemas de entidades son el futuro del desarrollo de MMOG" . Archivado del original el 26 de diciembre de 2013. Recuperado el 25 de diciembre de 2013 .
- 1 2 Martin, Adam. "Los sistemas de entidades son el futuro del desarrollo de MMOG Parte 2" . Archivado del original el 26 de diciembre de 2013. Recuperado el 25 de diciembre de 2013 .
- ↑ "Presentación de GameplayKit - WWDC 2015 - Vídeos" . Archivado del original el 6 de octubre de 2017. Consultado el 6 de octubre de 2017 .
- ↑ "Unity lanza la demo Megacity: millones de objetos en un enorme mundo ciberpunk" . MCV/DEVELOP . 24 de octubre de 2018. Consultado el 24 de junio de 2021 .
- ↑ "¿Por qué usar una arquitectura de sistema de componentes de entidades para el desarrollo de juegos?" . www.richardlord.net . Consultado el 18 de noviembre de 2021 .
Enlaces externos
- Anatomía de un nocaut
- Evoluciona tu jerarquía
- Wiki de sistemas de entidades
- Componente - Patrones de programación de juegos
- Diseño de ECS para lograr una verdadera inversión del control de flujo.
- Patrón arquitectónico (informática)
- patrones de diseño de software