Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 6 sur 6
  1. #1
    Membre actif Avatar de Kromagg
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    août 2008
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : août 2008
    Messages : 275
    Points : 158
    Points
    158

    Par défaut Component based architecture

    Bonjour

    Est-ce que vous connaissez le modèle de programmation "Component-based programming" ? Voici un lien très intéressant sur le sujet Component-based game design

    Je me demandais si on pouvais adapter ce modèle dans le développement d'un moteur 3D par exemple pour la gestion d'un graphe de scène. On aurait des components de ce genre
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    class Component
    {
    public:
         virtual ~Component();
         virtual void Initialize() = 0;
         virtual void Update() = 0;
         virtual void Shutdown() = 0;
    };
     
    class MeshComponent : public Component
    {
    public:
         virtual ~MeshComponent();
     
         virtual void Initialize();
         virtual void Update();
         virtual void Shutdown();
     
         void SetMeshData(MeshData* pMesh);
     
    private:
         MeshData* m_pMesh;
    };
     
    class LightComponent : public Component
    {
    public:
         virtual ~LightComponent();
     
         virtual void Initialize();
         virtual void Update();
         virtual void Shutdown();
     
         void SetLightData(LightData* pLight);
     
    private:
         LightData* m_pLight;
    };
    Et pour le graphe de scène on pourrait avoir ce genre d'acteurs :
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    class Actor : public Spatial
    {
    public:
         virtual ~Actor();
         template<class T> T* AddComponent<T>();
         void RemoveComponent(Component* pComponent);
         void RemoveAllComponents();
         template<class T> T* GetComponent<T>();
     
         void UpdateComponents(float dt);
     
    protected:
         std::vector<Component*> m_vComponents;
    };
     
    class MeshActor : public Actor
    {
    public;
         MeshActor (MeshData* pMesh)
         {
              MeshComponent* pMeshComponent = this.AddComponent<MeshComponent>();
              pMeshComponent->SetMeshData( pMesh );
         }
    };
     
    class LightActor: public Actor
    {
    public;
         LightActor(LightData* pLight)
         {
              LightComponent* pLightComponent = this.AddComponent<LightComponent>();
              pLightComponent ->SetLightData( pLight);
         }
    };
    On pourrait ainsi construire facilement notre graphe de scène et créer nos propres acteurs (rigidbody, particules,...)

    Kromagg
    C'est dans ses rêves que l'homme trouve la liberté cela fut, est et restera la vérité! (John Keating - Le cercle des poètes disparus)

  2. #2
    Responsable 2D/3D/Jeux

    Avatar de LittleWhite
    Homme Profil pro Alexandre Laurent
    Ingénieur développement logiciels
    Inscrit en
    mai 2008
    Messages
    16 407
    Détails du profil
    Informations personnelles :
    Nom : Homme Alexandre Laurent
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : mai 2008
    Messages : 16 407
    Points : 78 201
    Points
    78 201

    Par défaut

    Bonjour,

    Ça ne fait pas un peu God Class, que les architectes C++ n'aiment pas vraiment ?
    Sinon, êtes vous sur qu'il n'y a pas de moteurs 3D, Open source qui utilise déjà une architecture dans ce genre ?
    Sauf que l'on ne dit pas Component, mais Node pour le scene graph, mais cela revient à donner la même faciliter pour la conception de l'arbre, je crois.
    Vous souhaitez participer à la rubrique 2D / 3D / Jeux ? Contactez-moi
    La rubrique a aussi un blog !

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre actif Avatar de Kromagg
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    août 2008
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : août 2008
    Messages : 275
    Points : 158
    Points
    158

    Par défaut

    Citation Envoyé par LittleWhite Voir le message
    Bonjour,

    Ça ne fait pas un peu God Class, que les architectes C++ n'aiment pas vraiment ?
    Sinon, êtes vous sur qu'il n'y a pas de moteurs 3D, Open source qui utilise déjà une architecture dans ce genre ?
    Sauf que l'on ne dit pas Component, mais Node pour le scene graph, mais cela revient à donner la même faciliter pour la conception de l'arbre, je crois.
    Pourquoi trouves-tu que ça fait God Class ? Pour moi chaque composant fait son travail en interne. Ils sont maintenus par un objet de type Actor.

    Je sais que Unity fonctionne de cette manière mais via l'éditeur, comment ça se passe en derrière (node, meshscenenode...) je ne sais pas.

    Heu dans mon cas je n'assimile pas un Component à un Node mais plutôt un Actor à un Node. Ici l'acteur n'est qu'un conteneur de Component et c'est justement via se mécanisme que l'on peut créer n'importe quel type d'Actor (mesh, light, rigidbody...) en ajoutant le composant adéquate à mon Actor
    C'est dans ses rêves que l'homme trouve la liberté cela fut, est et restera la vérité! (John Keating - Le cercle des poètes disparus)

  4. #4
    Responsable 2D/3D/Jeux

    Avatar de LittleWhite
    Homme Profil pro Alexandre Laurent
    Ingénieur développement logiciels
    Inscrit en
    mai 2008
    Messages
    16 407
    Détails du profil
    Informations personnelles :
    Nom : Homme Alexandre Laurent
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : mai 2008
    Messages : 16 407
    Points : 78 201
    Points
    78 201

    Par défaut

    Je n'arrive pas trop à saisir l'avantage, à part que tu sépare les données de ton arbre, ce qui est une bonne chose, je pense.

    Si j'en crois l'article, l'idée est que l'on peut avoir un Component de position, un Component de Rendu, un Component ... et que du coup, lorsque tu crée un nouveau objet, au lieu de le faire hériter de mille classe, tu vas juste faire un Actor et lui ajouter des Component.

    Dans le code de l'Actor, je pense que tu peux encore plus simplifié grâce au template

    Qu'est ce que tu reprochais aux autres méthodes / implémentation des moteurs ? (et en quoi cette façon de faire est mieux ?)
    Vous souhaitez participer à la rubrique 2D / 3D / Jeux ? Contactez-moi
    La rubrique a aussi un blog !

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Membre actif Avatar de Kromagg
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    août 2008
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : août 2008
    Messages : 275
    Points : 158
    Points
    158

    Par défaut

    Citation Envoyé par LittleWhite Voir le message
    Je n'arrive pas trop à saisir l'avantage, à part que tu sépare les données de ton arbre, ce qui est une bonne chose, je pense.
    Ca évite d'avoir tout un tas de classes (MeshActor, LightActor, CameraActor...), je peux créer autant d'Actor différents que je veux et les personnaliser plus facilement (bien que l'on peut fournir une panoplie d'Actor de base notamment les caméra, les meshes...). Et puis je peux également coder le comportement de mon Actor via des ScriptComponent (C++, Lua, JS...). Ces ScriptComponent auraient accès à tout un tas d'informations sur l'Actor (position, orientation...) plus accès aux autres Components. C'est vraiment comme ça que fonctionne Unity 3D. Si tu veux jetter un oeil à la documentation elle est vraiment très bien faite.
    Unity Script Reference

    Citation Envoyé par LittleWhite Voir le message
    Si j'en crois l'article, l'idée est que l'on peut avoir un Component de position, un Component de Rendu, un Component ... et que du coup, lorsque tu crée un nouveau objet, au lieu de le faire hériter de mille classe, tu vas juste faire un Actor et lui ajouter des Component.
    C'est exactement ça, cela évite d'avoir un tas de classe spécialisées (MeshNode, LightNode,...) qui peuvent être difficile à maintenir et à faire évoluer. Mais je me demande si je peux appliquer cette technique dans un graphe de scène.

    Citation Envoyé par LittleWhite Voir le message
    Dans le code de l'Actor, je pense que tu peux encore plus simplifié grâce au template
    Ah bon comment ferais-tu ?

    Citation Envoyé par LittleWhite Voir le message
    Qu'est ce que tu reprochais aux autres méthodes / implémentation des moteurs ? (et en quoi cette façon de faire est mieux ?)
    Ah non mais je ne dis pas que cette façon de faire est mieux Comme j'utilise pas mal Unity j'ai fait des recherches sur le Net et je suis tombé sur plusieurs articles concernant ce modèle de programmation. Et j'aimerai essayer de l'intégrer directement dans un graphe de scène au lieu de passer par tout un tas de classe SceneNode (light, mesh...). Maintenant je ne dis pas que c'est la bonne méthode, je cherche juste des avis
    C'est dans ses rêves que l'homme trouve la liberté cela fut, est et restera la vérité! (John Keating - Le cercle des poètes disparus)

  6. #6
    Responsable 2D/3D/Jeux

    Avatar de LittleWhite
    Homme Profil pro Alexandre Laurent
    Ingénieur développement logiciels
    Inscrit en
    mai 2008
    Messages
    16 407
    Détails du profil
    Informations personnelles :
    Nom : Homme Alexandre Laurent
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : mai 2008
    Messages : 16 407
    Points : 78 201
    Points
    78 201

    Par défaut

    Ah bon comment ferais-tu ?
    C'est vraiment du sucre syntaxique, je doute que ça vaille le coup à long terme.
    Code c :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    template <class TComponent, class TData> 
    class SpecialisedActor : public Actor
    {
    public:
         SpecialisedActor (TData* pData)
         {
              assert(pData);
     
              TComponent* pComponent = this.AddComponent<TComponent>();
              pComponent->SetData( pData );
         }
    };
     
    typedef SpecialisedActor<MeshComponent, MeshData> MeshActor;
    Vous souhaitez participer à la rubrique 2D / 3D / Jeux ? Contactez-moi
    La rubrique a aussi un blog !

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •