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 :

Jeu 2D : Opengl plus long que la SDL ?


Sujet :

Développement 2D, 3D et Jeux

  1. #1
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 225
    Points : 10 168
    Points
    10 168
    Par défaut Jeu 2D : Opengl plus long que la SDL ?
    Bah certain font me dire que y a un souci (que je le conçois) pourtant j'ai créer deux versions de mon jeux , une avec le Lib SDL et autre avec opengl sans SDL et freeglut comme systeme de fenêtrage.
    Chez moi la version SDL utilise que 10% cpu contre 80% avec la version opengl ^^'

    voila le jeu en question : lien direct ou lien megaupload

    Niveau code c'est exactement les mêmes sauf pour évènement/fenêtrage (gérer par freeglut) et affichage par opengl avec glVertex2f (au lieu de SDL_blit).

    Donc je me pose une question pourquoi une telle différence de travail cpu ?

  2. #2
    Membre éprouvé Avatar de oxyde356
    Homme Profil pro
    Ingénieur Recherche Imagerie
    Inscrit en
    Février 2006
    Messages
    797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Recherche Imagerie

    Informations forums :
    Inscription : Février 2006
    Messages : 797
    Points : 1 087
    Points
    1 087
    Par défaut
    Qu'est ce qui te permet de dire que c'est plus long ? Tu as regarder le nombre de FPS dans les deux cas ou le temps d'affichage d'une frame ?

  3. #3
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 617
    Points
    15 617
    Par défaut
    glVertex2f (au lieu de SDL_blit)
    Sans avoir le détail du code, c'est difficile de savoir d'où vient le problème (mais il doit y avoir un problème dans tous les cas ) mais si tu utilises glVertex2f dans un cas (qui envoi les données une par une) et un blit dans l'autre (qui envoi un paquet de données en même temps... ce qui sollicite moins le cpu), la différence ne serait pas étonnante. A voir comment tu gères l'affichage

  4. #4
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 225
    Points : 10 168
    Points
    10 168
    Par défaut
    Citation Envoyé par oxyde356 Voir le message
    Qu'est ce qui te permet de dire que c'est plus long ? Tu as regarder le nombre de FPS dans les deux cas ou le temps d'affichage d'une frame ?
    Chez moi la version opengl fait plus de calcul que la version SDL (difference de cpu).
    Sans le control FPS , ma version SDL tourne a 1830fps et opengl 60

    Citation Envoyé par gbdivers Voir le message
    Sans avoir le détail du code, c'est difficile de savoir d'où vient le problème (mais il doit y avoir un problème dans tous les cas ) mais si tu utilises glVertex2f dans un cas (qui envoi les données une par une) et un blit dans l'autre (qui envoi un paquet de données en même temps... ce qui sollicite moins le cpu), la différence ne serait pas étonnante. A voir comment tu gères l'affichage
    Non juste glVertex2f de toute façon je peux pas faire de Blit , dans ma version opengl j'utilise pas la SDL( sauf si je recodé un truc dans le même genre mais j'en verrais pas intérêt).

    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
    19
    20
    21
    22
    23
     
    void Face2D(float x,float y,float z)
    {
        glTexCoord2f(0.0f, 0.0f);
        glVertex3f(-x,-y, z);	// Haut Gauche
        glTexCoord2f(1.0f, 0.0f);
        glVertex3f( x,-y, z);	// Haut Droite
        glTexCoord2f(1.0f, 1.0f);
        glVertex3f( x, y, z);	// Bas Droite
        glTexCoord2f(0.0f, 1.0f);
        glVertex3f(-x, y, z);	// Bas Gauche
    }
     
    void MNS_Draw(MNS_image *image,float l,float h,MNS_REPERE position,float resl,float resh)
    {
     
        glTexImage2D(GL_TEXTURE_2D,0,image->type,image->w,image->h,0,image->format,GL_UNSIGNED_BYTE,image->couleur);
        glLoadIdentity();
        glTranslated(position.x,position.y,0.0f);
        glBegin(GL_QUADS);
        Face2D(l*resl,h*resh,0);
        glEnd();
    }

  5. #5
    Membre éprouvé Avatar de oxyde356
    Homme Profil pro
    Ingénieur Recherche Imagerie
    Inscrit en
    Février 2006
    Messages
    797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Recherche Imagerie

    Informations forums :
    Inscription : Février 2006
    Messages : 797
    Points : 1 087
    Points
    1 087
    Par défaut
    60 c'est le nombre de rafraîchissement de l'affichage, pas le nombre de calculs de frames par seconde. Désactive la synchronisation verticale sous freeglut pour avoir une vrai estimation des FPS.

  6. #6
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 225
    Points : 10 168
    Points
    10 168
    Par défaut
    Citation Envoyé par oxyde356 Voir le message
    60 c'est le nombre de rafraîchissement de l'affichage, pas le nombre de calculs de frames par seconde. Désactive la synchronisation verticale sous freeglut pour avoir une vrai estimation des FPS.
    Non non j'avais régler mes FPS a 50 , sans le framerate il met 60 mais comme je l'ai dit rien étonnant , j'avais 85% cpu a 50 fps ,donc bon sans le control fps il risquait pas de faire beaucoup plus =P.

    Mais apparemment j'ai regardé un peu,et je possède pas une super accélération graphique donc en faite je voulais savoir si les autre utilisateur avait un cpu bas en utilisant opengl (on tous cas plus bas que la SDL).
    On tous cas sur mon ordi Opengl est plus lent.

  7. #7
    Membre éprouvé Avatar de oxyde356
    Homme Profil pro
    Ingénieur Recherche Imagerie
    Inscrit en
    Février 2006
    Messages
    797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Recherche Imagerie

    Informations forums :
    Inscription : Février 2006
    Messages : 797
    Points : 1 087
    Points
    1 087
    Par défaut
    Citation Envoyé par Kannagi Voir le message
    Non non j'avais régler mes FPS a 50
    Comment ? et pourquoi le sont-ils sur OpenGL et pas sur ton code en SDL ?
    Citation Envoyé par Kannagi Voir le message
    sans le framerate ... [???] ... il met 60 mais comme je l'ai dit rien étonnant
    Je n'ai pas pigé cette phrase.

  8. #8
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 617
    Points
    15 617
    Par défaut
    je voulais savoir si les autre utilisateur avait un cpu bas en utilisant opengl (on tous cas plus bas que la SDL).
    Avec un portable (core 2 T8300, GT 8600M), sans timer, j'ai un FPS à plus de 500 et un CPU à 90% mais avec timer, j'ai un FPS à 60 et un CPU à 2%.

    Donc ce n'est pas un problème OpenGL mais bien son utilisation...

  9. #9
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 225
    Points : 10 168
    Points
    10 168
    Par défaut
    Je vais essayer d’être clair ^^'

    Citation Envoyé par oxyde356 Voir le message
    Comment ? et pourquoi le sont-ils sur OpenGL et pas sur ton code en SDL ?
    Bah on reprend de zéro , les deux code sont identique (sauf a quelque détails près) donc possède tous les 2 un FPS de 50.
    J’enlève la fonction que j'ai créer pour régler le FPS a 50 est les résultat sont ceux dit plus haut (1857 et ~60) (et oui pour freeglut j'ai enlevé qu'il gère le framerate ).

    Citation Envoyé par gbdivers Voir le message
    Avec un portable (core 2 T8300, GT 8600M), sans timer, j'ai un FPS à plus de 500 et un CPU à 90% mais avec timer, j'ai un FPS à 60 et un CPU à 2%.

    Donc ce n'est pas un problème OpenGL mais bien son utilisation...
    Ah , cela veut dire que je devrai aussi avoir a peu près les même résultats ?
    Apres je voudrais justement savoir comment bien utiliser surtout que je ne fais rien de spécial j'ai montrer plus haut les seul code opengl que j'utilise (si on enlève initialisation).

  10. #10
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 617
    Points
    15 617
    Par défaut
    En me relisant, je réalise que je n'ai pas été clair : les perfs indiqués correspondent à mon propre code, pas à ton application.

    Ce que je voulais dire, c'est qu'OpenGL n'occupe pas autant le cpu normalement.

    Sur ton application, j'ai une charge cpu de 20% (et 25Mo en ram) avec la version OpenGL et moins de 1% (et 5Mo en ram) avec la version SDL.

    Pour l'explication, perso, il me faudrait plus de code (en particulier la version SDL) et d'explications...

  11. #11
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 225
    Points : 10 168
    Points
    10 168
    Par défaut
    Le code est assez conséquent donc je vais mettre les code ou il y a des différences (tres peu sinon je n'aurait pas risquer a faire un portage ).

    main_GL.c

    main_SDL.c

    stage_GL.c

    stage_SDL.c

    Pour les perso c'est pareil que le stage.

    Ah oui la différence de mémoire c'est du que je redimensionne les images en 2^N sur opengl .

  12. #12
    Membre confirmé Avatar de TNT89
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Points : 615
    Points
    615
    Par défaut
    Citation Envoyé par Kannagi Voir le message
    Chez moi la version SDL utilise que 10% cpu contre 80% avec la version opengl ^^'
    Donc je me pose une question pourquoi une telle différence de travail cpu ?
    Tu tournes sous quel OS, quel CPU et quel GPU? Tes drivers sont à jour?

  13. #13
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 225
    Points : 10 168
    Points
    10 168
    Par défaut
    Citation Envoyé par TNT89 Voir le message
    Tu tournes sous quel OS, quel CPU et quel GPU? Tes drivers sont à jour?
    Windows 7 ,Mobile Intel Pentium M 730J, 1600 MHz (12 x 133) ,Carte vidéo Intel 82915GM Graphics Controller 0
    Non je ne crois pas ^^'.

    Mais même si c'est un problème de mon ordi ,on tous cas par exemple pour gbdivers la version opengl devrait utilisait moins de CPU que la SDL.

  14. #14
    Membre confirmé Avatar de TNT89
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Points : 615
    Points
    615
    Par défaut
    Non pas forcément, j'ai déjà vu mon processeur avoir du mal avec un driver libre (Nouveau ne supporte pas ma carte graphique, résultat : le CPU était utilisé à 80% pour le moindre affichage 3D).

  15. #15
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 225
    Points : 10 168
    Points
    10 168
    Par défaut
    Oh ok mais si ordinateur qui possède une carte graphique a jour , opengl devrai est plus rapide que la SDL, m'enfin j'ai montré mon jeu pour que les personne puisse tester eux même et voir si la version opengl a moins de CPU que la SDL (et donc plus rapide si c'est le cas).

    Je voudrais savoir surtout parce que si c'est 1% qui profite de accélération matérielle c'est pas utile dans mon cas (en restant en 2D pur).

  16. #16
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 617
    Points
    15 617
    Par défaut
    Petite remarque sur une fausse idée répandue : l'accélération matérielle n'accélère pas forcement une application !

    Cela va dépendre du type de traitement que tu fais et de la qualité du code :
    Le GPU est surtout efficace sur du traitement parallèle avec des accès non concurrent (chaque thread accède à des données différentes). De plus, il y a un coût non négligeable pour transférer les données entre le CPU et le GPU. Donc typiquement, un traitement qui demande plus de transfert de données que de calcul ne sera pas efficace sur GPU.


    Ceci étant dit, voyons ton code.

    Dans la version SDL, tu fais un blit pour copier ton image vers ta variable ecran (de type SDL_Surface*) puis tu fais un SDL_Flip pour afficher tes données contenu dans ecran.

    Dans la version OpenGL, tu utilises la fonction MNS_Draw, sans passer de variable ecran et sans appeler de fonction équivalente à SDL_Flip. On peut supposer que MNS_Draw affiche donc directement à l'écran les images.

    Donc dans un cas, tu envoies 1 images, dans l'autre, tu en envoies plusieurs. Ça peut expliquer la surcharge du CPU.


    Si tu veux profiter pleinement de l'accélération matérielle, voici comment je ferais :
    - pour éviter les transfères entre le CPU et GPU, j'enverrais toutes les images dans la mémoire du GPU 1 seule fois, au chargement de la zone de combat
    - je rassemblerais les images des animations dans une même texture (donc au finale 1 texture pour la scène, 2 textures pour les perso et 1 texture pour les effets)
    - A chaque affichage, il suffit alors d'envoyer que les coordonnées des textures et de la scène pour tout afficher, le GPU se chargeant de faire les blit nécessaires
    Ainsi, tu minimises les transferts et augmente les calculs fait par le GPU


    Bon courage

  17. #17
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 225
    Points : 10 168
    Points
    10 168
    Par défaut
    Ta réponse m'a bien aidé ,c'est un peu dommage que les tutoriaux n'explique pas en détails le fonctionnement des librairies,donc on gros utilisait glGenTextures et glBindTexture.

    Je vais tester ça quand j'aurais un peu de temps libre.

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 896
    Points : 219 544
    Points
    219 544
    Billets dans le blog
    125
    Par défaut
    Citation Envoyé par Kannagi Voir le message
    Ta réponse m'a bien aidé ,c'est un peu dommage que les tutoriaux n'explique pas en détails le fonctionnement des librairies,donc on gros utilisait glGenTextures et glBindTexture.

    Je vais tester ça quand j'aurais un peu de temps libre.
    Je n'ai aucune idee du pourquoi vous parlez de glGenTextures / glBindTextures ... et de leur liens dans les bibliotheques.

    Sinon, je suis reelement perplexe pour votre integration SDL / OpenGL dans votre programme. Effectivement, je chercherai a faire une interface plus uniforme (point de vue programmation) au lieu de faire deux programmes qui me semble completement differents.

  19. #19
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 617
    Points
    15 617
    Par défaut
    Tu ne m'as pas totalement compris je crois... Le problème n'est pas l'utilisation des textures mais le fait de dessiner chaque image directement au lieu de "stocker" les images intermédiaires dans une seule image qui sera envoyée en une seule fois.

    glGenTextures/glBindTextures te permettra de stocker les images sur le GPU mais ne faut pas quand même les redessiner à chaque draw

  20. #20
    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
    nan mais sans rire, ton code openGL reussi le tour de force, en très peut de ligne, a faire TOUTES les erreurs à ne pas faire niveau perf

    déjà, tu utilise le mode immédiat, ce n'est pas bien
    ensuite, tu fait un glBegin/glEnd pour chaque quad au lieu de les regrouper par type
    et finalement, l'erreur ultime, tu ré envoi le contenu de ta texture pour chaque quad...

    en fait, ton code devrait plutot ressemblé à un truc du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    chargement du programme :
    - charger toutes les textures utilisées
    boucle de jeu:
    pour chaque texture
      binder la texture utilisé
      créer un vecteur de vertex
      pour chaque quad
        push des vertex de mon quad dans le vecteur
      finPour
      envoyer tout les vertex en même temps 
    finpour
    déjà, rien qu'avec ça, ça devrait tourner beaucoup plus vite

Discussions similaires

  1. Réponses: 2
    Dernier message: 30/11/2008, 17h26
  2. Réponses: 3
    Dernier message: 11/04/2008, 11h19
  3. Un type plus long que le type "double"
    Par savoir dans le forum Débuter
    Réponses: 5
    Dernier message: 09/04/2008, 15h05
  4. souligner plus long que le texte
    Par Samyhijodelaluna dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 15/03/2007, 14h23
  5. tyoe d'entier plus long que 32 bits
    Par LIMODIN dans le forum MFC
    Réponses: 4
    Dernier message: 13/01/2004, 20h08

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