IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Création de jeux vidéo Discussion :

Identifiant d'entité du jeu : entier ou GUID ?


Sujet :

Création de jeux vidéo

  1. #1
    Membre averti

    Profil pro
    Inscrit en
    Mai 2002
    Messages
    638
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 638
    Points : 408
    Points
    408
    Par défaut Identifiant d'entité du jeu : entier ou GUID ?
    Bonjour,

    Pour mon jeu Historia, j'utilise un système à entités.

    Je ne vais pas expliquer ici en détail ce qu'est un système à entités, ce n'est pas l'objet. Pour résumer, les systèmes à entités répondent aux limites d'une approche orientée objets (création de hiérarchies de classes). Dans un système à entités on associe dynamiquement des composants (classes ou structures représentant les données) à des entités qui ne sont au final que des identifiants.

    J'ai écrit une petite bibliothèque en FreePascal en me basant sur les concepts proposés ici.
    La classe TEntityManager permet de gérer les entités et composants.

    Ma question porte sur le type de variable à utiliser pour l'identifiant : entier ou UUID ? Les exemples proposés (en Java, Objective C...) utilisent des entiers pour identifier les entités. Mais l'article suggère d'utiliser des GUID au lieu d'entiers.

    En FreePascal, le type TGUID est un enregistrement (équivalent d'un struct de C/C++). La solution qui me semble la plus simple est de convertir cet identifiant en chaîne de caractères : 110e8400-e29b-11d4-a716-446655440000.

    Est-ce une bonne idée d'utiliser des chaînes au lieu d'entiers comme identifiants des entités du jeu, sachant que je dois gérer au final plusieurs dizaines de milliers d'entités ? Quelles sont les conséquences sur les performances (CPU, mémoire) ?

    Je développe en Free Pascal mais je pense que ma question est valable dans n'importe quel langage.

  2. #2
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Hello,

    Citation Envoyé par Neuromancien2 Voir le message
    Est-ce une bonne idée d'utiliser des chaînes au lieu d'entiers comme identifiants des entités du jeu, sachant que je dois gérer au final plusieurs dizaines de milliers d'entités ? Quelles sont les conséquences sur les performances (CPU, mémoire) ?
    C'est ce qui doit répondre à ta question.

    Un entier 32 bits c'est ~4.3 milliards de possibilités, en 64 bits c'est 1.8E19 (18 milliards de milliards) de possibilités. Si c'est suffisant, un entier fait l'affaire.
    Ces nombres semblent énormes (et ils le sont), mais si tu ne souhaites pas réattribuer un identifiant il faut prévoir assez grand dès les début.

    Niveau performance, les entiers seront plus rapides.

    Les UUID ont par contre l'avantage d'être aléatoires.
    Dans certains cas ça peut poser problèmes de savoir quels autres id existent. Avec des entiers si j'ai l'id 1234, il y à de fortes chances que l'id 1233 existe et soit valide.

    edit : un UUID est simplement un entier de 128 bits. Si tu utilise des UUID évite de les manipuler comme des chaines de caractères, c'est lent.

  3. #3
    Membre averti

    Profil pro
    Inscrit en
    Mai 2002
    Messages
    638
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 638
    Points : 408
    Points
    408
    Par défaut
    Bonjour,

    Citation Envoyé par Iradrille Voir le message
    Un entier 32 bits c'est ~4.3 milliards de possibilités, en 64 bits c'est 1.8E19 (18 milliards de milliards) de possibilités. Si c'est suffisant, un entier fait l'affaire.
    Ces nombres semblent énormes (et ils le sont), mais si tu ne souhaites pas réattribuer un identifiant il faut prévoir assez grand dès les début.

    Niveau performance, les entiers seront plus rapides.
    Citation Envoyé par Iradrille Voir le message
    Si tu utilise des UUID évite de les manipuler comme des chaines de caractères, c'est lent.
    Merci pour la réponse. Cela confirme ce que je pensais. J'ai réécrit mon code pour utiliser des entiers, avec la possibilité de réattribuer les identifiants.

  4. #4
    Membre expert

    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Février 2006
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2006
    Messages : 1 031
    Points : 3 092
    Points
    3 092
    Par défaut
    En utilisant un système de GUID ça sera bien plus facile d'éviter les collisions si 2 utilisateurs ajoutent des entités au même moment.
    Concernant les perfs normalement tu es censé avoir une méthode qui te hash très rapidement ton guid, ça sera donc toujours un poil plus lent mais rien de gênant.
    Pour te donner une idée sur Unity dans l'éditeur c'est un système de GUID qui est utilisé et c'est ce que j'ai pu constater sur plusieurs projets pro.
    Suivez le développement de Chibis Bomba
    twitter : https://twitter.com/MoD_DiB
    DevBlog : http://moddib.blogspot.fr/

  5. #5
    Expert confirmé Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Points : 5 485
    Points
    5 485
    Par défaut
    Bonsoir.

    Pour compléter ce qui a été dit, la raison du choix des GUID dans un éditeur comme Unity tient avant tout au fait qu'un projet Unity est édité concurremment par plusieurs utilisateurs et machines en réseau. Il n'est donc pas souhaitable qu'un client ait besoin de communiquer avec d'autres clients pour réserver un identifiant ou une plage d'identifiants. Pour cela on a créé les UUID/GUID : de très grands identifiants uniques dans le temps et l'espace (fonctions d'un identifiant matériel, de l'heure et d'un compteur spécifique à cette machine, le tout transformé par une fonction crypto).

    Toutefois si les objets de ton jeu ne sont créés que par un seul ordinateur/utilisateur, alors un simple entier 32 bits fera l'affaire. Une chaîne de caractères n'a d'intérêt que pour le déboguage et seulement si tu as des chaînes expressives. La comparaison serait d'ailleurs plus lente.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Identifier une entité héritée
    Par metalsephiroth dans le forum Entity Framework
    Réponses: 3
    Dernier message: 06/08/2012, 20h00
  2. Réponses: 6
    Dernier message: 15/04/2009, 21h17
  3. Réponses: 4
    Dernier message: 20/02/2008, 13h34
  4. Une entite pas identifiant au sein d une relation
    Par poulping dans le forum Schéma
    Réponses: 6
    Dernier message: 25/05/2006, 14h01
  5. Générer un identifiant relatif > l'entité faible en prati
    Par vmolines dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 19/08/2005, 15h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo