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

Architecture Discussion :

Conception architecture de plugs-in enfichables


Sujet :

Architecture

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 104
    Points : 84
    Points
    84
    Par défaut Conception architecture de plugs-in enfichables
    Bonsoir,

    Avec quelques amis, on a décidé de créer un jeu qui nous permettrait d'apprendre à gérer un projet d'une certaine taille. Ce serait un jeu de stratégie en 2D utilisant la SDL et openGL. Vu l'ampleur du travail qui nous attend, on aimerait faire les choses de façon «propre».

    Et justement j'avais une idée concernant la conception de base du jeu. Je voudrais savoir si c'est réalisable de cette façon ou tout simplement impossible.
    Sachant que nous sommes plusieurs à coder, je me suis dit autant développé un coeur autour duquel on pourrait ajouter des plugins. Donc ce qui impliquerait que de base le programme ait besoin d'un certain nombre de plugins obligatoires, par exemple gestion du clavier, souris, affichage etc. Puis certains plugins optionnels un système de communication par exemple.

    Bien évidemment, pour commencer on fixe la barre très basse histoire de ne pas se leurrer, et justement la structure de coeur puis l'ajout de plugins autour nous permettrait de faire évoluer le programme de façon souple.

    Pour gérer les plugins justement, sachant que pour l'instant on travaille avec le système GNU/Linux, on se contenterait des fonctions systèmes dlopen, dlsym, dlerror, et dlclose. Par exemple, un dossier contiendrait l'ensemble des plugins (en fait des bibliothèques partagées donc) et au chargement du programme on chargerait, le contenu de ce dossier.

    Voilà donc pour l'instant c'est très théorique (rien est codé) et donc je voudrais juste savoir si ça pouvait être possible (d'autant que le concept de coeur + plugins me parait intéressant).

    Merci à vous.

    Bye.

    PS : si vous avez des exemples de pièges dans lesquels ne pas tomber ou des exemples concrets, je suis preneur car je ne trouve pas beaucoup de choses sur ce sujet.
    On code le projet en C, si il y a une section plus appropriée que celle là pour parler de conception, je ne l'ai pas vu :-\.

  2. #2
    Membre expérimenté Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Points : 1 544
    Points
    1 544
    Par défaut
    bonjour

    Ici peut etre

    bon courage
    "vaste programme"

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 104
    Points : 84
    Points
    84
    Par défaut
    Re,

    Si un modérateur pouvait déplacer ce topic dans la section appropriée ;-).

    Alors avoir après cherché quelques détails sur l'utilisation en général des plugins, j'ai de nouvelles questions. Par exemple dans le logiciel firefox, lorsque l'on veut ajouter un plugin, le code fournit par les développeurs n'a pas besoin d'être remanié, les plugins sont bien indépendants. Or dans l'utilisation de dlopen, on utilise un pointeur de fonction (adresse de la fonction récupérée à l'aide de dlsym). Donc ce n'est pas totalement indépendant vu que l'on appelle ces fonctions depuis le programme.

    Peut-être est-ce que pour cela que parfois les plugins sont codés dans un langage scripté, ce qui permet de l'interpréter à l'aide d'un interpréteur. Par exemple un coeur codé en C et les plugins en python.

    Parce que si dans mon programme j'ai un plugin qui permet de gérer l'affichage, je dois récupérer l'adresse des fonctions du plugin pour pouvoir les appeler...

    En fait je cherche un moyen de gérer les différents plugins sans avoir à récupérer toutes les adresse avec un dlsym chacune. Biensur je pense qu'on peut faire un tableau de fonction si les noms sont stockés quelque part mais je ne sais trop quelle solution employée.

    Si vous pouviez m'aiguiller un peu ;-).

    Merci.

    Bye

    PS : je ne sais pas si c'est très clair ce que je viens de dire...

  4. #4
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    Ce que tu peux faire c'est prévoir dans l'interface de tes plugins une fonction unique qui renvoit une structure qui te donne toutes les informations dont tu as besoin. Les adresses des différentes fonctions seront retournée dans cette structure. Tu peux aussi y ajouter des informations supplémentaires comme le nom du plugin, une description, un numéro de version... C'est toi qui voit.

    Sur le fond ce n'est pas très différent de faire un dlsym() pour chaque fonction, mais l'avantage c'est que c'est moins lourd. Tu fais un dlopen() puis un dlsym(), et tu récupère toutes les adresses (et les autres infos) en un appel.

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    C'est l'équivalent de ce qu'on fait en C++ avec une fonction qui retourne un pointeur d'interface, et ça marche très bien. Je ne peux que plussoyer.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 104
    Points : 84
    Points
    84
    Par défaut
    Alors donc si j'ai bien compris, tous les plugins doivent posséder un certain nombre de fonctions communes (ici une, nous renvoyant la structure contenant toutes les informations dont on a besoin). Par exemple, une fonction declarer_plugin(), qui renverrait une structure avec les adresses des fonctions (sous forme de listes ou de tableau), version du plugin et cie.

    Alors jusqu'ici ça va sauf sur le point des adresses des fonctions. Les plugins doivent tous posséder une fonction en commun, comme par exemple execute_plugin() sinon comment le coeur du programme peut savoir quelle fonction du plugin appelée ?

    Donc je pense concevoir le programme de cette façon, je fais une base statique (ensemble de .o) nécessaire au fonctionnement de base, puis après je permets l'ajout de plugins dans un certain répertoire (ensemble de .so). Et avec pas mal de boulot, on devrait pouvoir s'en sortir ;-).

    Voilà donc dernier problème de l'appel d'une fonction d'un plugin, une fonction spécifique dans le plugin ou une autre méthode et je vous laisse tranquille ^^.

    Merci à vous.

    Bye

    EDIT : Donc si j'ai compris dans le coeur de mon programme j'aurais un ensemble de fonction chargeant tous les plugins , mais le petit détail qui me gêne pour l'instant, c'est qu'une fois que je me retrouve avec les différentes adresses de fonctions, pour y accéder je fais comment ? Parce que si il n'y avait qu'une seule fonction du style cosinus c'est simple mais si j'en ai une dizaine, je me retrouve avec un tableau de 10 pointeurs de fonction. Donc est-ce que ce fameux tableau contient aussi le nom des fonctions (tableau de structures) puis à chaque fois on parcourt le tableau et on trouve la fonction ?

    Fin voilà il manque une petite liaison dans la compréhension, pour un ou deux plugins pas de soucis mais pour un ensemble et l'accès aux différentes fonctions, c'est un peu plus complexe.

Discussions similaires

  1. Réponses: 9
    Dernier message: 13/08/2007, 16h41
  2. Conseils en Conception / Architecture
    Par olive_le_malin dans le forum C++
    Réponses: 4
    Dernier message: 03/02/2007, 02h18
  3. Comment réaliser une GUI ? (conception, architecture)
    Par Ange_de_coren dans le forum API graphiques
    Réponses: 33
    Dernier message: 21/08/2006, 12h39
  4. [N-Tier] Problème conception architecture 3-tiers
    Par Royd938 dans le forum Autres
    Réponses: 3
    Dernier message: 17/06/2005, 11h47
  5. [Plug-In] Comment faire une architecture de plug-in
    Par Alec6 dans le forum Architecture
    Réponses: 5
    Dernier message: 18/04/2005, 14h37

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