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

Java Discussion :

Entity Component System


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Mai 2014
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 227
    Par défaut Entity Component System
    Bonjour à tous, depuis le temps que je programme, j'avais souvent entendu parler de l'ECS (Entity Component System). J'avais un peu regardé le principe, mais je n'ai jamais pu réellement mettre ce principe de conception en place car peu de documentation sur le sujet (du moins quasi inexistant en français et peu en anglais). Aujourd'hui, je développe nouveau jeu et j'aimerais mettre ce principe (qui m'a l'air plutôt efficace) en oeuvre.
    J'ai trouvé un bon début d'explication mais j'ai quelques nuages noirs par rapport à où sont stockées les "données".
    J'ai compris ceci :
    Entity :
    -> Sorte d'identifiant qui va définir un objet du jeu : Voiture / Arbre / Pnj / etcetera...

    Component :
    -> C'est un composant qui sert à la construction d'un objet : Couleur / Forme / Type de bidule / etcetera...

    System :
    -> Il sert à la mise à jour des entités et de leurs composants...

    C'est un peu mon résumé de l'ECS, mais je ne comprends pas tout et j'ai donc plusieurs questions.

    1. Es que c'est l’entité qui stockent/lie s'est composant ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public class Entity
    {
         ...
     
         vector<Component> components;
     
         ...
    }
    2. Si je veux appliquer par exemple la couleur rouge à mon objet, comment je fais ?

    3. Comment le system gère les mises à jour des EC ?

    J'aurai sûrement d'autres questions, mais pour le moment ces trois questions sont les plus importantes.

    Je vous remercie

  2. #2
    Membre émérite
    Avatar de Cafeinoman
    Homme Profil pro
    Couteau suisse d'une PME
    Inscrit en
    Octobre 2012
    Messages
    628
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Couteau suisse d'une PME

    Informations forums :
    Inscription : Octobre 2012
    Messages : 628
    Par défaut
    Salut,

    Il me semble que pour l'entity, elle ne stocke rien d'autre que son id. A la limite, ça pourrait être une interface fonctionnelle... pour ce qui est du lien entre entity et component, ça se fait normalement dans le system, via une map.
    En fait, tu manipule que des id, pas d'objet comme on l'entend d'habitude. Par exemple, tu ne vas pas sélectionner les instances de la classe ennemis, mais l'ensemble des ils ayant un composant attaque mais pas de composant jouable.
    Normalement, tu doit pouvoir trouver de la doc sur le site de JMonkeyEngine, avec leur EntitySystem qui est disponible sur Github.
    Après attention, un ECS, c'est complexe et pas habituel. En gros, si tu n'as pas un modèle de classes qui foire à cause de l'héritage multiple, pas sûr que ce soit une bonne idée. Même si après c'est intéressant d'essayer par curiosité.

    Bon courage.

  3. #3
    Membre très actif
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Mai 2014
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 227
    Par défaut
    Merci pour ta réponse , j'ai écrit un petit bout de code, es que c'est bien comme ceci que c'est censé fonctionner ?

    EntityManager
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public abstract class EntityManager 
    {
    	public EntityManager(Map<Long,Vector<Component>> entities)
    	{
    		this.entities = entities;
    	}
     
    	protected Map<Long,Vector<Component>> entities;
    }
    EntitySytem
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    public final class EntitySystem extends EntityManager
    {
    	public EntitySystem(Map<Long, Vector<Component>> entities) 
    	{
    		super(entities);
    	}
     
    	public void attach( long id, Component c )
    	{
    		if( entities.containsKey(id) )
    		{
    			entities.get(id).add(c);
    		}
                    ....
    	}
     
    }
    Entity
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public class Entity 
    {
    	public Entity( long id )
    	{
    		this.id = id;
    	}
     
    	public long id()	{return this.id;}
     
    	private final long id;
    }

  4. #4
    Membre émérite
    Avatar de Cafeinoman
    Homme Profil pro
    Couteau suisse d'une PME
    Inscrit en
    Octobre 2012
    Messages
    628
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Couteau suisse d'une PME

    Informations forums :
    Inscription : Octobre 2012
    Messages : 628
    Par défaut
    Ça m'a l'air correct. Mais jette un oeil ici : https://jmonkeyengine.github.io/wiki...itysystem.html , tu trouveras ton bonheur, et tu as le lien vers le Github en bas de page...

  5. #5
    Membre très actif
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Mai 2014
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 227
    Par défaut Optimisation d'un ECS
    Re-Bonjour, après la mise en place de mon ECS, je me pose quelques questions en ce qui concerne la performance.

    J'ai lu qu'un composant dois être immuable, donc si j'ai un composent CPosition2D

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    public class CPosition2D extends Component
    {
       public CPosition2D( double x, double y )
       {
          this.x = x;
          this.y = y;
       }
     
       public double x()   {return this.x;}
       public double y()   {return this.y;}
     
       private final double x;
       private final double y;
    }
    et que je dois appliquer par exemple de la gravité à plusieurs entités utilisant celui-ci, es que les performances seront nettement basses malgré le peu d'instruction à effectuer ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
     
    public final class EntityManager
    {
       ...
       protected Map<Entity,Vector<Component>> entities; // Entity = Long
       ...
    }
     
    public class PhysicSystem extands EntityManager
    {
       ...
       private void applyGravity() { ... }
       ...
    }
    Car si je veux changer la position de mon entité, je dois supprimer son composant CPosition2D puis en instancier un nouveau et le remplir par les nouvelles coordonnées (après calcul de la nouvelle position).

    Je pense qu'un ECS est réservé aux gros jeux nécessitant le multi-Threading et donc les composants sont immuables pour éviter les problèmes de synchronisation. Mais es que dans mon cas, un jeu single thread donc, il est vraiment nécessaire d'avoir des composants immuables ?

    Je vous remercie

  6. #6
    Membre très actif
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Mai 2014
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 227
    Par défaut Héritage
    Bonjour à tous ! J'ai une simple question, peut-on avoir des Composant abstrait ?

Discussions similaires

  1. Entity Component System et ID unique
    Par MrPchoun dans le forum C++
    Réponses: 1
    Dernier message: 13/06/2016, 10h53
  2. Réponses: 3
    Dernier message: 09/09/2012, 22h19
  3. Réponses: 1
    Dernier message: 19/03/2012, 16h39
  4. Réponses: 3
    Dernier message: 30/09/2009, 11h36
  5. Utilisation de System.ComponentModel.Component
    Par stephane.julien dans le forum C#
    Réponses: 6
    Dernier message: 27/05/2008, 09h34

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