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

OpenGL Discussion :

[openGL] Methodes d'optimisations.


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2011
    Messages : 25
    Par défaut [openGL] Methodes d'optimisations.
    Hello,

    J'ai un gros soucis d'optimisation sur un projet sous openGL 2.1.

    Je genere une map (constituee de Cube et Spheres texturees)
    Mais une simple map de 25x25 entraine deja de gros ralentissement.

    Etant debutant sous openGL j'aimerai avoir pas mal de petits conseils

    La map est realisee sous la forme d'un vecteur de vecteur contenant "les cases (Des classes contenant le cube representant la case elle meme et un vecteur d'objet present sur la case (joueurs, items sur la case typiquement)".

    Chaque case est donc constituee d'un cube texture identique.. pour le moment je redessine chacun de ces cubes individuellement a chaque boucle.
    -> Ca me semble pas opti du tout, mais je sais pas vraiment quels sont les moyens d'ameliorer ca.

    Pour le dessin des cubes et spheres, pour le moment je les dessine de facon "immediate" mais je suis entrain de passer en VBO, je ne pense pas que ce soit une solution miracle, mais je pense que ca ne peux que aider.

    Pour le moment je bind a chaque cube, sphere, mais je suis entrain de modifier cela pour bind le moins de fois possible.

    Je "preload" les textures une seule fois en debut de programme puis passe des pointeurs vers celle-ci au moment de bind, c'est toujours mieux que de les recharger a chaque fois, mais peut-etre y-a-t-il mieux encore ?

    Je travaille avec la SFML + openGL je sais pas si il y a egalement des petites choses a faire de ce coter la.

    Tout autre conseil est egalement le bienvenu,
    Merci d'avance.

  2. #2
    Membre chevronné
    Inscrit en
    Février 2008
    Messages
    413
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Février 2008
    Messages : 413
    Par défaut
    Bonjour,

    Pour le dessin des cubes et spheres, pour le moment je les dessine de facon "immediate" mais je suis entrain de passer en VBO, je ne pense pas que ce soit une solution miracle, mais je pense que ca ne peux que aider.
    en effet, ca ne peut qu'aider...et je pense même que vous allez être surpris du résultat!

    => il n'y a rien de plus lent que le mode immédiat, surtout si vous dessinez chaque "case" de votre grille séparément.
    => pour le passage en VBO, le mieux est de dessiner votre grille en une passe à l'aide d'une GL_TRIANGLE_STRIP, de préférence indexée...mais je vous conseille d'y aller pas à pas:
    1. Vertex array, non indexé, pour dessiner à l'aide de GL_TRIANGLES => ca sous entend que les vertices communes à plusieurs triangles sont présentes plusieurs fois dans votre vertex array
    2. Vertex array, non indexé, pour dessiner à l'aide d'une GL_TRIANGLE_STRIP. Ca va réduire en gros de 2/3 le nombre de vertices présentes dans votre tableau
    3. Une fois que ca marche, la même chose en mode indexé, ce qui fait que chaque vertex n'est présent qu'une seule fois dans le vertex Array. Ce sont les indices qui sont alors répétés
    4. à partir de là ca devrait déjà aller beaucoup plus vite et il ne vous reste plus qu'à passer des vertex arrays aux VBOs, ce qui n'est pas très compliqué.


    Voilà pour une première grosse optimisation, essayez ca et si c'est toujours trop lent on se penchera sur le reste!

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2011
    Messages : 25
    Par défaut
    Bonjour.

    Merci de votre reponse,
    J'ai quelques questions (je suis relativement debutant sur openGL )

    pour le passage en VBO, le mieux est de dessiner votre grille en une passe à l'aide d'une GL_TRIANGLE_STRIP, de préférence indexée...mais je vous conseille d'y aller pas à pas:
    C'est a dire ? Je ne suis pas sur de comprendre.
    Tracer dans un premier temps uniquement la grille a l'aide d'un enssemble de Cube eux meme realise en Vertex Array ?

    (Ca deja etre assez dur ces VA.. :/)

    Question annexe: Les Display List semblent egalement etre un moyen efficace d'optimiser le rendum le couplage VBO + DisplayList aurait-il un interet ici ?

  4. #4
    Membre chevronné
    Inscrit en
    Février 2008
    Messages
    413
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Février 2008
    Messages : 413
    Par défaut
    Bonjour,

    Question annexe: Les Display List semblent egalement etre un moyen efficace d'optimiser le rendum le couplage VBO + DisplayList aurait-il un interet ici ?
    Non non NON!!! ) Les display list, c du passé, c déprécié et progressiment abandonné pour tout le monde! A la limite, elles peuvent apporter un gain de vitesse si vous utilisez le mode immédiat, mais puisqu'on vous déconseille ca au profit des Vertex Array / VBO, on oublie les display list direct!

    Concernant le dessin en lui même, on va y aller pas à pas. Regardez la pièce jointe, pour faire simple j'ai limité à 2 "cases" de votre grille, qui sont chacune dessinées avec 2 triangles: A et B forment la première case, et C et D la seconde.
    A est formé par les sommets (1,2,3), B par (2,3,4), C par (3,4,5) et D par (4,5,6).

    En mode direct, et en utilisant GL_TRIANGLES, ca donne:
    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
     
    glBegin(GL_TRIANGLES)
    // Triangle A
    glVertex... => sommet 1
    glVertex... => sommet 2
    glVertex... => sommet 3
     
    // Triangle B
    glVertex... => sommet 2
    glVertex... => sommet 4
    glVertex... => sommet 3
     
    // Triangle C
    glVertex... => sommet 3
    glVertex... => sommet 4
    glVertex... => sommet 5
     
    // Triangle D
    glVertex... => sommet 4
    glVertex... => sommet 6
    glVertex... => sommet 5
    glEnd()
    Toujours en mode direct, mais cette fois en utilisant GL_TRIANGLE_STRIP:
    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
     
    glBegin(GL_TRIANGLE_STRIP)
    // Triangle A
    glVertex... => sommet 1
    glVertex... => sommet 2
    glVertex... => sommet 3
     
    // Triangle B
    glVertex... => sommet 4
     
    // Triangle C
    glVertex... => sommet 5
     
    // Triangle D
    glVertex... => sommet 6
    glEnd()
    => vous voyez déjà qu'on "économise" l'envoi de pas mal de vertices rien qu'en utilisant une TRIANGLE_STRIP

    Quand vous passez en mode vertex, vous stockez dans un 1er temps tous vos sommets dans un tableau, puis au moment de dessiner vous passez à OpenGL divers pointeurs: où aller chercher les coordonées des sommets, leurs normales, couleurs, etc (je vous conseille d'aller voir un tuto sur les Vertex array, là ca dépasse le cadre de mes explications .

    Il reste alors 2 possibilités:
    - soit vous stockez dans le tableau TOUS les sommets, dans le même ordre que si vous utilisiez le mode direct
    - soit vous utilisez des indices, ce qui vous permet de ne stocker chaque sommet qu'une seule et unique fois

    (dans l'exemple des 2 cases, ca ne change rien vu qu'aucun sommet n'est répété, mais dès que vous passez à plus d'une ligne de cases, il y aura des répétitions).

    Essayez ces différentes étapes, la dernière étant de loin la plus rapide:
    - Mode immédiat, GL_TRIANGLE_STRIP
    - Vertex Array, GL_TRIANGLE_STRIP
    - Vertex Array + indices, GL_TRIANGLE_STRIP
    - VBO + indices, GL_TRIANGLE_STRIP

    J'espère que c'est un peu plus clair, bon courage en tout cas!
    Images attachées Images attachées  

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2011
    Messages : 25
    Par défaut
    Merci de nouveau pour votre réponse

    En ce qui concerne les DisplayList, ca a le mérite d'être clair, c'est oublié

    ---------------------------------------------------------------------------------------------------------------------------------------------------------

    (Resolu)

    Huge Edit:

    Voila qui est bon pour les Cubes en VA, j'avais un soucis avec les textures (j'avais fait mon cube avec uniquement 8 vertices, ce qui posait probleme pour les coordonnees de textures avec les sommets partages.)
    Je suis passe avec 24 Vertices maintenant et ca va mieux.

    J'essaye de passer en VBO maintenant, mais je pense aue ca sera plus simple.


    C'est bon les Cube en VBO passent

    ---------------------------------------------------------------------------------------------------------------------------------------------------------

    Edit:
    Question toujours relative aux VBO, le succes avec les Cubes etant maintenant atteint
    J'aurais souhaité savoir comment m'y prendre avec les Sphères.

    Chaque Sphere est sencee representer un objet sur une case, ca peut aller jusqu'a 8 objets... donc deja sur du 100x100 ca fait jusqu'a 8x100x100 = 80.000 appel a GluSphere(), autant dire qu'a ce moment la, c'est la mort x)

    Sachant que tout comme pour les cubes, je souhaite y appliquer leurs appliquer une texture.

    ---------------------------------------------------------------------------------------------------------------------------------------------------------

    Merci de votre aide en tout cas

  6. #6
    Membre Expert

    Profil pro
    Programmeur
    Inscrit en
    Août 2002
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Août 2002
    Messages : 1 091
    Par défaut
    Déjà il faut quantifier les choses "gros ralentissement" ça n'indique pas grand chose si on ne sait pas de combien on est parti à combien on est arrivé, si c'est injouable, juste suspicieusement lent (mais tout de même jouable) etc.

    Bref travaille à avoir une scène typique à afficher et dans l'idéal tu ne te soucies des problèmes de performance que quand tu as cette scène typique, un hardware typique (minimum et/ou recommandé), et une cible en FPS (30fps ? 60 fps ?).

    Mon site web | Mon blog | Mes photos | Groupe USA
    > BONJOUR, JE SUIS NOUVEAU SUR CE FORUM
    > presse la touche caps lock, stp
    > OH.. MERCI C EST BEAUCOUP PLUS FACILE COMME CA

Discussions similaires

  1. choix d'une methode d'optimisation
    Par gpcbitnik38 dans le forum Traitement d'images
    Réponses: 1
    Dernier message: 20/10/2012, 15h56
  2. Astuces du vieux guerrier en Opengl - optimisation
    Par mrbuisson dans le forum OpenGL
    Réponses: 2
    Dernier message: 10/12/2008, 17h38
  3. Optimisation par la methode du gradient conjugue
    Par mfontan dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 12/03/2008, 18h41
  4. Optimisation methode insertion
    Par keub51 dans le forum DB2
    Réponses: 9
    Dernier message: 09/10/2007, 11h32

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