¿Cuáles son los beneficios de usar un sistema de identificación de entidad?

12

Actualmente estoy leyendo el libro Programming Game AI By Example.

El libro menciona la asignación de números de identificación únicos a cada entidad en el juego. A menudo, cuando la entidad A necesita contactar a la entidad B , A obtiene una referencia a B enviando el número de ID de B a una clase EntityDatabase . Esta clase recibe números de identificación y devuelve referencias a las entidades.

Los números de identificación de algunas entidades también se pueden obtener de un archivo que contiene las identificaciones de algunas de las entidades (los personajes principales del juego).

Mi pregunta es: ¿por qué haría esto? ¿Por qué no puedo trabajar directamente con referencias? ¿A veces es difícil obtener una referencia directa? ¿Usar un sistema de identificación es un enfoque común? ¿Hay juegos que no usan ID?

Soy nuevo en el desarrollo de juegos. Explique los beneficios de trabajar con un sistema de identificación de entidad. Las ventajas y desventajas. Ejemplos concretos serían geniales. Gracias

Aviv Cohn
fuente

Respuestas:

18

Las referencias funcionan bien para muchas situaciones. Sin embargo, hay tres situaciones importantes en las que las referencias no funcionarán bien:

  • La creación de redes . Al enviar información sobre la sincronización del estado de las entidades a través de la red, no se pueden usar referencias. Deberá identificar la entidad de alguna manera para que las máquinas remotas sepan de quién está hablando.
  • Guardando / cargando . Al guardar el estado de su juego en el disco, las referencias a objetos no pueden ir con él. Eso significa que cuando está cargando el estado, la entidad A que tenía a la entidad B como objetivo por una referencia ya no sabe a quién dirigirse. Las ubicaciones de la memoria son diferentes, los objetos son diferentes.

  • Gestión de memoria . Tener un lugar central para almacenar referencias significa que al eliminar una entidad, no tiene que pasar por todas sus entidades y eliminar las referencias a ella para que se limpie la memoria. Las referencias solo deben usarse cuando sea necesario, y luego eliminarse en cualquier otra entidad. La reducción del recuento de referencias garantiza que no tenga entidades zombies a las que solo se haga referencia por la última cosa con la que interactuaron o alguna otra entidad. Esto también ayuda a evitar referencias nulas con una forma estandarizada de prueba si todavía existe una entidad.

MichaelHouse
fuente
2
El último párrafo debe ser una viñeta propia (gestión de memoria). Hay situaciones en las que una clase necesita una referencia a otra entidad durante algún tiempo, pero la referencia de la entidad puede volverse inválida (es decir, la entidad objetivo del proyectil murió). Al devolver NULL al solicitar una entidad por ID, cada clase se responsabiliza de hacer lo correcto (en lugar de bloquearse) cuando la referencia de la entidad deja de ser válida.
LearnCocos2D
Gracias por responder. Una pregunta para aclarar. En general: en situaciones en las que la entidad A necesita obtener una referencia a la entidad B (para atacarla, enviarle un mensaje, verificar la colisión con ella o cualquier otra razón) - ¿Debo usar el sistema de identificación para obtenerlo, o a veces está bien obtener la referencia directamente? Significado: ¿Debería la entidad A obtener siempre la referencia del EntityManager enviándole el ID de la entidad B (que hace referencias cruzadas de entidad y números de ID), y solo entonces contactar a la entidad B usando la referencia de EntityManager? ¿Debo usar siempre el sistema de identificación?
Aviv Cohn
¿O a veces está bien obtener la referencia directamente? En otras palabras, ¿cuándo debería usar la entidad A el EntityManager para obtener la referencia almacenada en su interior, y cuándo puede la entidad A obtener una referencia a B por cualquier medio que tenga?
Aviv Cohn
No hay una respuesta correcta real a eso. Personalmente, diseñaría el sistema de entidades para que sea independiente de la lógica del juego. Eso significaría que la lógica del juego ni siquiera tiene acceso a referencias directas de entidades. Esencialmente, evitaría mantener cualquier referencia a una entidad más allá del alcance local del método actual. Eso significa usar el EntityManager cada vez antes de operar en los componentes de una entidad.
MichaelHouse
Veo. Déjame usar un ejemplo para ver si entiendo lo que quieres decir. Digamos que estoy usando una cuadrícula uniforme para detectar colisiones. La cuadrícula es una matriz 2d. Se verifica la colisión de cada entidad solo con las entidades en la misma 'celda' en la cuadrícula. Usando el enfoque "regular", cada celda mantendría referencias a los objetos GameEntity en el área que representa. Usando el enfoque de "sistema de identificación", cada celda contendría los números de identificación de las entidades. Estos números se enviarían al EntityManager para recibir las referencias concretas para hacer la detección de colisión. ¿Es esto un buen entendimiento?
Aviv Cohn
2

Una última cosa es que si está utilizando el patrón de agrupación de objetos y una entidad se restablece porque la criatura murió (por ejemplo) y reapareció en otro lugar, una referencia todavía apuntará a la misma entidad (falla) y una ID ya no permanecerá válido.

La ID 5067 apunta a la dirección 0x8765. La criatura muere y otra genera. La nueva ID de criatura se reinicia a 7073. te informa que la criatura que intentaste alcanzar ya no está activa.

Esa y todas las maravillosas razones que menciona Byte56 son las razones por las que es un buen diseño evitar el uso de referencias directamente.

AturSams
fuente