Quels sont les avantages d'utiliser un système d'identification d'entité?

12

Je lis actuellement le livre Programming Game AI By Example.

Le livre mentionne l'attribution de numéros d'identification uniques à chaque entité du jeu. Souvent, lorsque l'entité A doit contacter l'entité B , A obtient une référence à B en envoyant le numéro d'identification de B à une classe EntityDatabase . Cette classe reçoit des numéros d'identification et renvoie des références aux entités.

Les numéros d'identification de certaines entités peuvent également être récupérés à partir d'un fichier contenant les ID de certaines des entités (les personnages principaux du jeu).

Ma question est: pourquoi ferais-je cela? Pourquoi ne puis-je pas travailler directement avec des références? Est-il parfois difficile d'obtenir une référence directe? L'utilisation d'un système d'identification est-elle une approche courante? Y a-t-il des jeux qui n'utilisent pas d'identifiants?

Je suis nouveau dans le développement de jeux. Veuillez expliquer les avantages de travailler avec un système d'identification d'entité. Les avantages et les inconvénients. Des exemples concrets seraient formidables. Merci

Aviv Cohn
la source

Réponses:

18

Les références fonctionnent bien dans de nombreuses situations. Cependant, il existe trois situations importantes dans lesquelles les références ne fonctionnent pas correctement:

  • Réseautage . Lors de l'envoi d'informations sur la synchronisation de l'état des entités sur le réseau, les références ne peuvent pas être utilisées. Vous devrez identifier l'entité d'une manière ou d'une autre afin que les machines distantes sachent de qui vous parlez.
  • Sauvegarde / chargement . Lorsque vous enregistrez l'état de votre jeu sur le disque, les références d'objet ne peuvent pas aller avec. Cela signifie que lorsque vous chargez l'état, l'entité A qui avait l'entité B ciblée par une référence ne sait plus qui cibler. Les emplacements de mémoire sont différents, les objets sont différents.

  • Gestion de la mémoire . Le fait d'avoir un emplacement central pour stocker les références signifie que lors de la suppression d'une entité, vous n'avez pas à parcourir toutes vos entités et à supprimer des références pour que la mémoire soit nettoyée. Les références ne doivent être utilisées qu'en cas de besoin, puis supprimées dans toute autre entité. La réduction du nombre de références garantit que vous n'avez pas d'entités zombies qui ne sont référencées que par la dernière chose avec laquelle elles ont interagi ou par une autre entité. Cela permet également d'éviter les références nulles avec un moyen standardisé de tester si une entité existe toujours.

MichaelHouse
la source
2
le dernier paragraphe devrait être une puce à part (gestion de la mémoire). Il y a des situations où une classe a besoin d'une référence à une autre entité pendant un certain temps, mais la référence d'entité peut devenir invalide (c'est-à-dire que l'entité cible du projectile est morte). En retournant NULL lors de la demande d'une entité par ID, chaque classe prend la responsabilité de faire la bonne chose (plutôt que de planter) lorsque la référence d'entité devient invalide.
LearnCocos2D
Merci de répondre. Une question à clarifier. En général: dans les situations où l'entité A doit obtenir une référence à l'entité B (pour l'attaquer, lui envoyer un message, vérifier la collision avec elle ou toute autre raison) - Dois-je utiliser le système d'identification pour l'obtenir, ou est-il parfois acceptable d'obtenir directement la référence? Signification: l'entité A doit-elle toujours obtenir la référence de l'EntityManager en lui envoyant l'ID de l'entité B (qui fait des références croisées aux références d'entité et aux numéros d'identification), et alors seulement contacter l'entité B en utilisant la référence de EntityManager? Dois-je toujours utiliser le système d'identification?
Aviv Cohn
Ou est-il parfois acceptable d'obtenir directement la référence? En d'autres termes, quand dois-je l'entité A utiliser EntityManager pour obtenir la référence stockée à l'intérieur, et quand l'entité A peut-elle récupérer une référence à B par tous les moyens dont elle dispose?
Aviv Cohn
Il n'y a pas vraiment de bonne réponse à cela. Personnellement, je concevrais le système d'entités pour être indépendant de la logique du jeu. Cela signifierait que la logique du jeu n'a même pas accès aux références d'entités directes. Essentiellement, j'éviterais de maintenir toute référence à une entité au-delà de la portée locale de la méthode actuelle. Cela signifie que vous devez utiliser EntityManager à chaque fois avant d'opérer sur les composants d'une entité.
MichaelHouse
Je vois. Permettez-moi d'utiliser un exemple pour voir si je comprends ce que vous voulez dire. Disons que j'utilise une grille uniforme pour effectuer la détection de collision. La grille est un tableau 2D. Chaque entité est vérifiée pour la collision uniquement avec les entités dans la même «cellule» de la grille. En utilisant l'approche "régulière", chaque cellule contiendrait des références aux objets GameEntity dans la zone qu'elle représente. En utilisant l'approche du "système d'identification", chaque cellule contiendrait les numéros d'identification des entités. Ces numéros seraient envoyés à l'EntityManager pour recevoir les références concrètes afin d'effectuer la détection de collision. Est-ce une bonne compréhension?
Aviv Cohn
2

Une dernière chose est que si vous utilisez le modèle Pool d'objets et qu'une entité est réinitialisée parce que la créature est morte (par exemple) et réapparue ailleurs, une référence pointera toujours vers la même entité (faute) et un ID ne restera plus valide.

L'ID 5067 pointe vers l'adresse 0x8765 La créature meurt et une autre génère un nouvel ID de créature est réinitialisé à 7073 Quelqu'un vérifie l'ID 5067, il pointe vers 0x8765 mais cette créature est maintenant enregistrée avec l'ID 7073, de sorte que la base de données d'ID d'entité sait que vous avez utilisé un ID obsolète et vous informe, la créature que vous avez essayé d'atteindre n'est plus active.

Cela et toutes les merveilleuses raisons mentionnées par Byte56 expliquent pourquoi il est judicieux d'éviter d'utiliser directement des références.

AturSams
la source