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

Développement 2D, 3D et Jeux Discussion :

Design / Conception d'un "Game Engine"


Sujet :

Développement 2D, 3D et Jeux

  1. #1
    Membre habitué
    Inscrit en
    Octobre 2004
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 616
    Points : 164
    Points
    164
    Par défaut Design / Conception d'un "Game Engine"
    Design / Conception d'un "Game Engine"

    Bonjour à tous, je suis ici car j’ai en tête depuis bien longtemps de faire un moteur de jeu 2D dans le but de pouvoir créer un RPG du même genre que secret of mana (avec un mode multi à 3 joueurs).

    J’ai déjà tenté l’expérience et ca c’est soldé par un échec dû à un design mal pensé qui s’est révélé très difficile à finir. J’ai donc abandonné et repris récemment sur de nouvelles bases en m’inspirant d’un article intéressant trouvé sur gamedev.net . Mais là encore je me rends compte que je fonce droit dans le mur (la série d’article sur laquelle je comptais me baser n’est pas terminée et ne le sera pas, il manque donc de grande étapes conceptuelle que je ne suis pas parvenu à comblé).

    Avant de continuer à coder tout et n’importe quoi j’ai décidé de m’arrêter et de réfléchir un peu à ce que je voulais obtenir. Dans un premier temps, je me suis fixer l’idée de faire un « pong » proprement, ce qui me permettra de poser une très grande partie des fonctionnalités de mon game engine . Ensuite je tenterai de faire une version multi-joueurs (2) de ce même pong. Et enfin je me lancerai sans doute dans la réalisation de mon projet initial.

    J’ai commencé à sérieusement réfléchir à une architecture de classes me permettant d’avoir un design propre, flexible et surtout viable à terme. J’aimerai beaucoup avoir votre avis dessus, il n’est certainement pas parfait et peut-être même pas viable. Je suis ouvert à toute critique/remarque.

    Après avoir tenté de modéliser tout ca, j’en suis venu à considérer le modèle suivant. (Je précise que je ne cherche pas à avoir un code 100% OO, ni même exploitant à fond les possibilités du c++, mais juste un code qui fonctionne en étant maintenable et simple).

    Le modèle du « tout-singleton » (non, non ne partez pas !). J’ai tout d’abord voulu séparer la programmation en divers module, et je me suis vite heurté à un problème récurent : comment ces modules vont-ils communiquer entre eux ? La plupart ont besoin des données du jeu pour fonctionner, données que l’ont doit pouvoir rassembler en une classe de base « Entity » ( un menu, un décor, une carte, un objet, une interface … pouvant être considérer comme une Entity distinctes). Ne trouvant pas de moyen élégant de passer les données qu’il faut à chaque module quand il en a besoin, j’ai décidé de rendre ces données disponibles pour tous !

    Premier point donc, un « EntityManager » en singleton (oui, je sais singleton dans ce cas équivaut juste a une grosse liste d’Entity déclarée en static …).

    Ensuite, il nous faut un endroit où stocker des ressources bruts (image - texture, son - musique, fonts) [Si vous voyez d’autres types de ressources bruts, pouvant être utilisées par plusieurs Entity signalez le moi, car je suis certain que j’en oublie !]. Ca nous amène donc à un « RessourceManager » dont le but sera de charger les type de données énoncé précédemment et de renvoyez un pointeur a l’Entity demandant la ressource. On s’assure ainsi que les ressources ne sont pas chargé en plusieurs exemplaires.
    Je n’ai pas pour le moment vraiment réfléchis à la durée de vie de ses ressources, c’est un point sur lequel il va falloir que je me penche, mais je pars du principe que ca peux attendre un peu et que mon design n’en sera pas trop pénaliser (arrêter moi si j’ai tord).

    Pour le moment j’ai donc un endroit où stocker des Entity , qui peuvent être composés de ressources bruts et d’autres Entity sans trop de problème.

    Petite parenthèse sur les « a côtés » : je dispose déjà d’un système de log qui me convient et d’un profiler externe si besoin. Enfin mon application est emballée dans deux classes. La première ayant juste pour but de garder un « main » clair et de charger des données nécessaire au bon lancement du moteur ( taille de la fenêtre, plein écran ou pas ….) et de lancer le noyau de jeu (Kernel).
    Ce Kernel va initialiser certains Manager (Ressources, Entity par exemple) et contenir la boucle de jeu.

    Avant d’attaquer cette boucle de jeu, des plus classiques, il me reste encore une ou deux classes à présenter.
    L’ « InputManager », dont le rôle sera de récupérer l’état des touches clavier et de la souris à chaque frame. Etant un singleton, tout le monde y aura accès, notamment les Entity , c’est là que réside l’un des mécanismes que je compte utiliser au mieux, mais que j’ai bien du mal à mettre en place (surtout dans les autres parties de mon moteur) : les « Events ». A sa création en particulier ou durant sa vie, chaque Entity pourra enregistrer auprès de l’ InputManager des Events . Un Event sera sous la forme d’une petite classe/structure, contenant : un pointeur vers l’Entity émettrice, le nom de l’Event et une/plusieurs condition de déclenchement.
    Ainsi en plus de récupérer l’état des Inputs (touche appuyé cette frame, touche appuyé, touche relâchée cette frame, touche relâchée, souris en X et en Y), l’ InputManager testera chacun des Event qu’on lui aura enregistrer et si d’eux voit ses conditions remplies il enverra à l’Entity dont le pointeur est contenu dans l’Event un message du nom de l’Event en question.

    On a donc maintenant un moyen de traquer les inputs à notre convenance et de les envoyer à qui de droit (le seul cas pouvant poser problème est celui des menus de jeu qui peuvent se superposer au jeu actuel et donc il faut veillez a ce que les inputs leur soit attribué en priorité, je n’ai pas encore réfléchis au problème, si vous avez des idées, n’hésitez pas).

    A cela on ajoute un SoundManager, singleton, qui va juste permettre des petites choses comme : jouer un son, pauser un son, arrêter un son, mettre en file d’attente un son, jouer un son en dégradé sonore, changer le volume sonore ect…

    On peut enfin revenir à notre boucle de jeu (contenu dans le Kernel) qui sera faites ainsi :

    - Appel à l’InputManager pour qu’il récupère les inputs, les stocke et envoie les Events dont les conditions sont remplies.
    - Appel à une classe Timer, qui va calculer le temps écoulé, le temps total et 2-3 trucs dans se style.
    -Appel d’une fonction Update () sur toute les Entity (accessible grâce au singleton : EntityManager), cette fonction va d’abord procéder au traitement de tout les Event venant de l’InputManager, puis va procéder a son update normal (IA, physique, animation etc. …)
    - Appel à une classe Network, dont le comportement reste à définir, mais qui devra assez tôt dans la conception être pris en compte ! (surement dés le premier pong terminer, vous pensez que ce n’est pas trop tard ?)
    - Appel à une tache : Render() qui va passer en revue chaque Entity et l’afficher à ‘écran si elle est visible.
    -> on boucle depuis le début !


    Voila l’idée principale ! A vous de me dire ce que vous en pensez 

    A cela, il reste quelques choses majeures que je n’ai pas résolu :

    1) La communication entre Entity, j’aime bien l’idée de l’envoie de message, j’aimerai garder cela mais je ne sais pas trop comment.
    2) Comment définir les actions à prendre quand on recoit un message, je me vois mal tout codé en dur, j’aimerai pouvoir définir ca dans des fichiers simplement (xml ou autre) vous avez des idées ? Un langage de script comme LUA ferait-il mon affaire ? (je demande car je n’ai jamais utilisé)
    3) Toute la partie network …

    Dans le cas du système de messages Input->Entity et Entity<->Entity, il est sans doute préférable de traiter un message dés qu’il est reçu, plutôt que périodiquement à chaque frame, non ?

    Merci de m’avoir lu, désolé de la longueur du pavé, j’attends impatiemment vos remarques / conseils / critiques / encouragement ou autre ^^
    Par ailleurs si connaissez un livre (fr / en) traitant de se sujet de façons vraiment intéressante, l’architecture même d’un moteur de jeu, abordable d’un point de vue technique (si possible basé sur du C++) je suis preneur !

    PS : Ce message sera posté sur au moins deux forums différents, j’essaierai de faire le bilan des remarques d’un post sur l’autre !

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Salut

    Tout d'abord j'admire ta persévérance, depuis le temps que je te vois poster ici des pavés de questions existencielles (ce qui est une bonne chose) concernant la conception d'un moteur de jeu.

    Personnellement je n'ai rien à redire concernant la conception que tu as présentée, c'est aussi ce vers quoi j'ai convergé depuis que j'écris des moteurs.

    Je n’ai pas pour le moment vraiment réfléchis à la durée de vie de ses ressources, c’est un point sur lequel il va falloir que je me penche, mais je pars du principe que ca peux attendre un peu et que mon design n’en sera pas trop pénaliser (arrêter moi si j’ai tord).
    Tout pareil. L'idée que j'ai pour plus tard, c'est d'abstraire la stratégie de gestion des ressources. Ainsi il sera facile de coder plusieurs stratégies et d'utiliser celle que l'on veut à la volée.
    Genre ResourceManager::GetInstance().SetStrategy<Texture>(new StrategyMachinChouette);

    le seul cas pouvant poser problème est celui des menus de jeu qui peuvent se superposer au jeu actuel et donc il faut veillez a ce que les inputs leur soit attribué en priorité, je n’ai pas encore réfléchis au problème, si vous avez des idées, n’hésitez pas
    Peu importe la manière dont tu implémenteras ça (système de GUI, écrans de jeu, ...), tu verras que de toute façon tu te retrouveras toujours à coder un système de priorité et de focus. Donc ne t'embête pas avec ça pour le moment, de toute façon tu y passeras plus tard.

    1) La communication entre Entity, j’aime bien l’idée de l’envoie de message, j’aimerai garder cela mais je ne sais pas trop comment.
    De quelle genre de communication parles-tu ? Le réseau ? Ou bien un truc beaucoup plus générique que tu n'as pas encore bien défini ?

    2) Comment définir les actions à prendre quand on recoit un message, je me vois mal tout codé en dur, j’aimerai pouvoir définir ca dans des fichiers simplement (xml ou autre) vous avez des idées ? Un langage de script comme LUA ferait-il mon affaire ? (je demande car je n’ai jamais utilisé)
    XML (pour le descriptif) + Lua (ou autre langage de script -- pour les actions) c'est très bien. C'est ce que j'utilise personnellement et professionnellement.

    Bonne chance

  3. #3
    Membre habitué
    Inscrit en
    Octobre 2004
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 616
    Points : 164
    Points
    164
    Par défaut
    Tout d'abord j'admire ta persévérance, depuis le temps que je te vois poster ici des pavés de questions existencielles (ce qui est une bonne chose) concernant la conception d'un moteur de jeu.
    Ca fait plaisir ! Merci pour les réponses.


    Tout pareil. L'idée que j'ai pour plus tard, c'est d'abstraire la stratégie de gestion des ressources. Ainsi il sera facile de coder plusieurs stratégies et d'utiliser celle que l'on veut à la volée.
    Genre ResourceManager::GetInstance().SetStrategy<Texture>(new StrategyMachinChouette);
    J'aime bien la notion de "stratégie" car en fin de compte c'est vraiment de ca qu'il s'agit !

    De quelle genre de communication parles-tu ? Le réseau ? Ou bien un truc beaucoup plus générique que tu n'as pas encore bien défini ?
    Je parle de la communication du style :
    Entity1 indique a Entity 2 qu'elle vient d'entrer en collision avec elle.
    Entity1 recoit un event "Lancer Sortilège en (x,y), il faut que l'entity en (x,y) recoive un event "Sortilège ennemie" contenant toute les information necessaires.

    En fait, le passage de message d'une entitées à l'autre ne devrai pas poser de problème, on en revient juste au traitement des messages effetifs ( il faut vraiment que je mette le nez dans LUA...D'ailleurs j'y vais de ce pas !!)

  4. #4
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    -> on boucle depuis le début !
    Vu la puissance actuelle des machines (cpu/gpu), je pense qu'on pourrait remplacer la traditionnelle main-loop par des objects actifs (thread) ayant chacun leur propre loop (avec des frequences differentes).

    En effet, il est prefferable d'avoir le Render() qui tourne a une cadence elevée (+75 fps) et les network,timer,... a une frequence plus basse.

    Pour la communication, un systeme avec des queues de messages me semble efffectivement bien vu.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  5. #5
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Vu la puissance actuelle des machines (cpu/gpu), je pense qu'on pourrait remplacer la traditionnelle main-loop par des objects actifs (thread) ayant chacun leur propre loop (avec des frequences differentes).

    En effet, il est prefferable d'avoir le Render() qui tourne a une cadence elevée (+75 fps) et les network,timer,... a une frequence plus basse.
    Oui, mais pas au niveau le plus haut. C'est plutôt chaque module qui va faire sa sauce et se mettre à jour à sa propre fréquence si besoin. Mais du point de vue du moteur, tout ça doit rester transparent (cf. les moteurs de physique).

  6. #6
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Oui, mais pas au niveau le plus haut. (...) Mais du point de vue du moteur, tout ça doit rester transparent
    pas compris...

    Autant je comprend la necessite de faire un Entity.update() avant de faire un Render(Entity), autant je comprend pas pourquoi il faut avoir fait TOUS les update() avant de faire TOUS les Render(). Plus il y aura d'entity, plus la cadence va chuter. Or il y a de grandes chances que certaines Entity soient plus changeantes que d'autre... par exemple la balle du pong par rapport aux elements du decor, a l'affichage des scores, ...


    Donc je verrai plus des objets actifs avec des envois/lectures de messages

    - L'InputManager qui emplile des messages dans la GlobalMessageQueue

    - Le MessageDispatcher qui dépile les messages depuis la GlobalMessageQueue et qui les empile dans les Entity.MessageQueue que le message interesse (abonnement)

    - Les EntityManager qui appellent les Entity.update(). Je dis "LES" EntityManager, car ca serait bien d'en avoir plusieurs (cf. plus bas)

    - Le Render qui affiche les Entity lorsqu'un EntityManager a fini de mettre a jour sa liste d'Entity.

    Pourquoi plusieurs EntityManager ? Comme ca, on peut creer un EntityManager avec une priorité elevé qui aura terminé son cycle de mise a jour plus vite ==> Le Render affichera ces entités la plus souvent que les autres. Par exemple dans Pong le BalleManager aurait une priorité superieure au RaquetteManager, lui meme superieure au DecorManager, lui meme superieure au ScoreManager, ...
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  7. #7
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Pourquoi plusieurs EntityManager ? Comme ca, on peut creer un EntityManager avec une priorité elevé qui aura terminé son cycle de mise a jour plus vite ==> Le Render affichera ces entités la plus souvent que les autres. Par exemple dans Pong le BalleManager aurait une priorité superieure au RaquetteManager, lui meme superieure au DecorManager, lui meme superieure au ScoreManager, ...
    Ce n'est pas une bonne idée de ne pas tout afficher à la même fréquence. D'ailleurs je ne sais pas comment tu veux faire, il faut bien que tu effaces ton écran à chaque tour de boucle, et donc que tu réaffiches tout.

    Par contre, avoir des fréquences différentes pour chaque module (graphique, physique, réseau, ...) est une bonne idée -- je croyais d'ailleurs que c'était de ça que tu parlais, mais comme je le disais ça doit rester encapsulé dans le module, et non être géré par le moteur.

  8. #8
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par Laurent Gomila
    il faut bien que tu effaces ton écran à chaque tour de boucle, et donc que tu réaffiches tout.
    Que je réaffiche tout, ok. Mais pas que je recalcule tout (physique, ia, ...) ! Ca serait bcp trop couteux, d'autant plus que certaines entity n'auront pas bougé (comme le décors).

    Imagine un shoot'em up en 2D, avec scroll vertical. On ne va pas recalculer le décors 50 fois par seconde. Seuls les vaisseaux et les missilles seront recalculés a cette frequence.

    Pour le décor, on a juste besoin de calculer la prochaine bande (disons une bande de 64 pixels de haut). Et pour calculer cette bande on a du temps, car on a pas encore fini d'afficher la bande precedente (car le scroll est leeennnnt).
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  9. #9
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    943
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 943
    Points : 1 156
    Points
    1 156
    Par défaut
    Le mode le du "tout singleton" c'est ce que j'ai fait pour mon dernier "moteur" depuis 6 mois.

    C'est une bonne idée a la base, j''ai trouvé ca sympa vu que l'on peut les voir comme des variables globales.
    Un pattern facade pour obligé une certaine interface et un modele client/serveur entre module pour la communication.

    Mais la je penche plutot pour faire un truc plus generique et plus orienté objet.
    J'ai décidé de repartir de ZERO, y compris mes classes utlitaires qui commence a dater, en inserant par exemple un MemoryManager fait maison et une GUI egalement maison.

    Mon plus gros souci est de separer mon archi de la techno, comment ne pas penser mon archi en sachant que je vais utiliser SDL ou GLUT, OpenGL ou DX, ... d'autant plus que la GUI en est tres dependante.

    Bref, je reflechis a comment faire un truc generique et extensible, par contre je pense sincerement que lka solution se trouve du cote de l'objet, même si les variables globales sont tentantes, ca reste une solution de facilité et non une reel solution.

    Je ne dis pas posséder la solution ultime.

    Pour GameDev tu parle de l'article sur l'ingenieurie logicielle en 5 parties ?

  10. #10
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Que je réaffiche tout, ok. Mais pas que je recalcule tout (physique, ia, ...) ! Ca serait bcp trop couteux, d'autant plus que certaines entity n'auront pas bougé (comme le décors).

    Imagine un shoot'em up en 2D, avec scroll vertical. On ne va pas recalculer le décors 50 fois par seconde. Seuls les vaisseaux et les missilles seront recalculés a cette frequence.

    Pour le décor, on a juste besoin de calculer la prochaine bande (disons une bande de 64 pixels de haut). Et pour calculer cette bande on a du temps, car on a pas encore fini d'afficher la bande precedente (car le scroll est leeennnnt).
    Ok je comprends mieux ce que tu voulais dire

  11. #11
    Expert confirmé
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 524
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 524
    Points : 5 184
    Points
    5 184
    Par défaut
    Citation Envoyé par pseudocode
    Que je réaffiche tout, ok. Mais pas que je recalcule tout (physique, ia, ...) ! Ca serait bcp trop couteux, d'autant plus que certaines entity n'auront pas bougé (comme le décors).
    dans ce cas, ce sont les modules (physique, IA, décor) qui, indépendemment, savent s'il doivent recalculer des positions ou s'ils n'ont rien à faire

    concernant ton exemple du décor de scrolling vertical, tu scrolles à chaque image, donc 50 fois par seconde si tu veux, mais c'est le module qui sait s'il doit préparer la bande suivante, il peut anticiper, ou la préparer au moment où tu en a besoin, au risque de devoir faire attendre le reste du programme si les autres modules ont terminé avant lui
    selon la stratégie que tu lui aura programmé en quelque sorte
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  12. #12
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    @shenron666:

    Oui, ce que j'ai appelé EntityManager, c'est ce que toi tu appelles Module.

    Mais es-tu d'accord pour dire que ces Modules sont independants et donc threadé ?

    cf Multithreaded Game Engine Architectures
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  13. #13
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Points : 5 323
    Points
    5 323
    Par défaut
    Citation Envoyé par shenron666
    dans ce cas, ce sont les modules (physique, IA, décor) qui, indépendemment, savent s'il doivent recalculer des positions ou s'ils n'ont rien à faire
    100% d'accord avec toi... le but c'est de proposer au module la possibilitée d'aller le plus vite possible, apres, c'est à lui de se debrouiller pour savoir si il en a impérativement besoin.
    certe, d'un point de vue programmation, ca entraine un appel de fonction parfois inutil, mais c'est nettement plus souple (et puis bon, 2~3 appel de fonctions ce n'est pas la mort dans un moteur complet)

    sinon, pour en revenir au propos initial, le coup du masse singleton, c'est bien (c'est ce que j'ai toujours fait) mais pas top en fait
    Le problème lorsqu'on utilise un singleton c'est qu'on introduit un couplage fort entre une classe et son nombre d'instances (c'est d'ailleure le but du singleton ).
    pourquoi devrait-on être limité à un seul gestionnaire de sons par exemple ? On peut se dire qu'en effet, il nous faut un gestionnaire de sons qui va centraliser tout les sons pour notre jeu et que si on en utilise plusieurs, on risque d'avoir des problèmes... mais si on réflechi à plus grande échelle, le fait d'avoir plusieurs gestionnaires de sons peut être très pratique si on crée des outils de developpement "embarqué" comme c'est le cas pour Doom3 par exemple.
    Quand on regarde le code du SDK de doom3, il precisent bien que le gestionnaire de son n'est pas en singleton car il peut exister un gestionnaire de sons pour le moteur de jeu et un gestionnaire pour les outils de créations (qui tournent en même temps)... l'utilisation d'un singleton ici etait effectivement trop limitative.

    en fait, dans une optique de réutilisation maximal, il est préférable d'eviter d'avoir un singleton pour tout les concepts relativement bas niveau car il sont souvent aventageusement remplacé par un seul singleton sur un concept plus haut niveau.
    par exemple, au lieu d'avoir un singleton sur tout les manager, on peut très bien avoir un seul singleton sur la classe Engine qui elle va stocker les managers en cours d'utilisation, ce qui peut permettre, par exemple, des technique de sioux comme le changement de manager de textures à la volée.
    Le changement de manager de textures à la volé consiste tout simplement à avoir plusieurs manager de textures, par exemple : un pour les textures du jeu et un pour les textures des menus. Comme ca, lors d'une recherche de texture au cours du jeu, on ne perd pas de temps à éliminer les textures des menu alors qu'on cherche la texture du sol...
    Par contre, le problème d'une telle technique est qu'elle introduit des indirections en plus pour acceder au managers, mais à ce prix la, on a un beau pattern facade sur notre Engine qui donne acces à toutes les fonctionnalitées du moteur pour pas cher (et en plus, généralement, ca facilite les includes ), et on augmente la reutilisabilité de nos modules (sauf si en interne d'un module, on s'amuse à aller appeler pleins de "singleton" sur d'autres modules, mais la c'est généralement qu'il y a un problème de conception qui entraine de fort couplage entre les modules)

    enfin bon, tout ca reste purement philosophique pour l'instant car j'utilise toujours personnellement plein de singleton partout
    * Il est infiniment plus simple de faire rapidement un code qui marche que de faire un code rapide qui marche
    * pour faciliter les recherches, n'oubliez pas de voter pour les réponses pertinentes
    Mes articles

  14. #14
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par bafman
    (et puis bon, 2~3 appel de fonctions ce n'est pas la mort dans un moteur complet)
    Bah ca dépend de ce que font les fonctions... Un appel de fonction c'est bloquant, donc si la function fait un calcul long et complexe (colision, physique, IA) , ton moteur est bloqué pendant ce temps la: pas d'affichage, pas d'acquisition, ...

    Perso, je trouve plus simple de faire tourner les modules chacun dans leur thread et que le Render recupere les derniers resultats disponibles.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  15. #15
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Citation Envoyé par pseudocode
    Bah ca dépend de ce que font les fonctions... Un appel de fonction c'est bloquant, donc si la function fait un calcul long et complexe (colision, physique, IA) , ton moteur est bloqué pendant ce temps la: pas d'affichage, pas d'acquisition, ...
    Là on parlait d'appels de fonctions inutiles (cas où le module n'a pas besoin de se mettre à jour et donc ne fait rien), donc cela ne concerne bien que le temps dû à l'appel de la fonction.

    Citation Envoyé par pseudocode
    Perso, je trouve plus simple de faire tourner les modules chacun dans leur thread et que le Render recupere les derniers resultats disponibles.
    Ce n'est pas forcément simple (il faut sans cesse faire gaffe à la synchronisation) ; d'autant plus que certaines APIs gèrent déjà leur update dans un thread séparé, en interne (par exemple le moteur de physique PhysX).

  16. #16
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par Laurent Gomila
    Ce n'est pas forcément simple (il faut sans cesse faire gaffe à la synchronisation) ; d'autant plus que certaines APIs gèrent déjà leur update dans un thread séparé, en interne (par exemple le moteur de physique PhysX).
    Si les modules sont deja threadé, ca sert a rien de threader le moteur evidement.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  17. #17
    Membre habitué
    Inscrit en
    Octobre 2004
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 616
    Points : 164
    Points
    164
    Par défaut
    Je suis la discution de près, même si ca reste encore un peu loin pour moi (la pluspart de vos suggestion sont de l'ordre de l'optimisation ... chose qui est loin pour moi malheureusement, mais ca ne fait pas de mal d'en apprendre plus !)

    Après une courte nuit de sommeil et une séance de lecture de divers tuto. sur LUA, j'en suis arrivé aux conclusions suivantes :

    LUA m'a l'air vraiment très interessant

    En bref, j'ai deux facons de déclencher des events .

    1) Par les input utilisateurs, ce qui est gérer par l'inputmanager qui va correctement les renvoyez ou il faut .
    2) Par les entitées même, pas de problème, par exemple pour le monstre kamizaze qui attaque a vue, on partout toutes les entitées et on prend le pointeur de la plus proche et on lui envoie l'event par exemple

    Ensuite il me fallait un moyen de décrire l'effet de ces events, c'est là que LUA entre en jeu, si j'associe chaque event avec un script .lua par exemple, je peut aisément arriver a des choses sympa.

    Une petites chose que j'ai un peu approfondis:
    - soit traiter les event recu quand il sont recu
    - soit les traiter a chaque frame

    J'hésite encore un peu, mais je penche plutot pour un traitement instannée des events, ca permet une réactivité plus grande .

    Ex : un personnage tape un autre (event: hit ), la cible recoit l'event et renvoie un event du type "j'ai une armure avec des pique, du perd 12 PV car tu ma touché" ...enfin c'est l'idée :p

    Bon et bien , il ne me reste plus qu'a voir tout ca de plus près et a commencer à coder certaine partie pour voi si ca se goupille bien !

  18. #18
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 18
    Points : 18
    Points
    18
    Par défaut
    -Appel d’une fonction Update () sur toute les Entity (accessible grâce au singleton : EntityManager), cette fonction va d’abord procéder au traitement de tout les Event venant de l’InputManager, puis va procéder a son update normal (IA, physique, animation etc. …)
    Excuse-moi de pas faire de commentaire un peu en retard mais je crois qu'au lieu de directement placer ton update() dans ton Entity (ou tes autres class )tu devrai crée une class abstraite Controler qui aura pour role tous encapsuler les updates puis de les stocker en queue ou en priorité de queue Contenue dans un ControlerManager.

    Cela aura pour envantage d'avoir une grande souplesse dans l'extension de celle-ci. Tu pourra également controler si tu dois updater une ou plusieur fois par frame, au debut de frame, en fin de frame, etc.

    C'est aussi un petit truc pour éviter les oblies d'update

    Car comme dit pseudocode ce n'est pas tous les entity qui ont les mêmes fréquences d'ajournement.

  19. #19
    Membre habitué
    Inscrit en
    Octobre 2004
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 616
    Points : 164
    Points
    164
    Par défaut
    En effet, j'ai partiellement prévu ca, je suis entrain de créer une task"render" et une "game_logic" qui gèreont le render() et le update(à si / quand besoin .

  20. #20
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    943
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 943
    Points : 1 156
    Points
    1 156
    Par défaut
    Pour ton systeme d'envent, j'ai procede de la facon suivante : une classe functor avec l'operator () qui me sert en fait de callback sur un script ruby (lua dans ton cas) qui execute une action.

    En partant de ce principe j'ai egalement pu integrer la GUI assez facilement.

Discussions similaires

  1. [Livre] Ultimate 3D Game Engine Design & Architecture
    Par ram-0000 dans le forum Livres
    Réponses: 0
    Dernier message: 03/06/2014, 22h33
  2. [Livre] Ultimate 3D Game Engine Design & Architecture
    Par nicolas66 dans le forum Développement 2D, 3D et Jeux
    Réponses: 68
    Dernier message: 15/02/2007, 17h23

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