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 :

optimisation pour CAO


Sujet :

OpenGL

  1. #1
    Membre régulier
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

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

    Informations forums :
    Inscription : Février 2011
    Messages : 266
    Points : 86
    Points
    86
    Par défaut optimisation pour CAO
    Bonjour a tous,

    Je suis vraiment débutante avec OpenGL, dons je vous demanderais de ne pas lésiner sur les explications ,et de pardonner mes maladresses.

    Voici mon soucis : je dois reprendre un projet en C++ d'un logiciel de CAO 2D, débuté par mon prédécesseur. Et lorsque beaucoup d’éléments sont affichés, je peut descendre jusqu’à 1 FPS, ce qui est assez problématique. Mon logiciel doit permettre d'ouvrir des fichiers de plusieurs millions d’élément et là mon programme à déjà des soucis avec plusieurs milliers d’éléments.
    Je ne sais vraiment pas comment optimiser la chose.

    Quelques précisions a savoir je doit pouvoir effectuer des zooms et des dé zoom sur des éléments qui ont une épaisseur donné (par exemple une ligne d'une épaisseur de 2 mm). Afin de pallier au cas d'un dé-zoom important mon prédécesseur avait mis en place un système de double affichage :
    - en ligne afin que même éloigné les éléments et toujours une épaisseur minimum
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     glLineWidth(2.0f);
    glBegin(GL_LINES);
    ... ensemble de glVertex3d(...)
    glEnd();
    - en QUAD afin que de près l'épaisseur soit la vrai épaisseur attribué à l'élément
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    glBegin(QUAD);
    ... ensemble de glVertex3d(...)
    glEnd();
    Ce système peut peut être alourdir l'affichage.

    ensuite j'ai lu que l'utilisation des glVertex3d n'est pas forcement optimal.

    Pourriez vous m'indiquer des façons d'optimiser l'affichage de mes éléments? Comme précisé au dessus je suis débutante avec les API graphiques donc n'hésitez pas à m'expliquer les choses qui vous paraissent évidente.

    Merci d'avance pour votre aide. Et si besoin d'explication supplémentaire n'hésitez pas à demander.

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 855
    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 855
    Points : 218 551
    Points
    218 551
    Billets dans le blog
    118
    Par défaut
    Bonjour,

    Oui, en effet, les glVertex*() ne sont pas optimaux. Vous pouvez les remplacer par les VBO.
    Après, pour garder les épaisseur de la ligne, c'est une très bonne question que pour le moment, je n'ai pas d'idée pour y répondre.

    Après, il faudra voir des optimisation du style : ne pas afficher les éléments hors de l'écran
    Je me demande pourquoi votre zoom ne semble pas être géré par un système de caméra ?
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

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

  3. #3
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 045
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 045
    Points : 11 368
    Points
    11 368
    Billets dans le blog
    10
    Par défaut
    Bonjour !

    Es-tu forcée d'utiliser OpenGL 1.x ?
    Car dans ce cas, tu peux garder un affichage en lignes et appeler glLineWidth avec la largeur voulue.
    Après, l'optimisation en passant par les VBO est toujours valable (et est vivement recommandée).
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  4. #4
    Membre régulier
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

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

    Informations forums :
    Inscription : Février 2011
    Messages : 266
    Points : 86
    Points
    86
    Par défaut
    Tout d'abord merci d'avoir pris le temps de répondre
    Oui, en effet, les glVertex*() ne sont pas optimaux. Vous pouvez les remplacer par les VBO.
    OK je vais regarder de ce coté

    Après, il faudra voir des optimisation du style : ne pas afficher les éléments hors de l'écran
    Question bête mais comment peut t'on faire ça? je l'ai dit je suis vraiment débutante et n'ai jamais touché au API graphique avant ça.

    Je me demande pourquoi votre zoom ne semble pas être géré par un système de caméra ?
    d'après ce que j'ai compris le Zoom est géré avec un système de translation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // On place la caméra :
            glTranslated(0.0f, 0.0f, -CamZoom);
            glRotated(RTOD(CamAngle.y), 1.0f, 0.0f, 0.0f);
            glRotated(RTOD(CamAngle.x), 0.0f, 1.0f, 0.0f);
            glTranslated(-CamLookAt.y, 0.0f, -CamLookAt.x);
    et voici la fonction de dézoom
    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
    double ZoomFactor = accelerated ? 1.2f : 1.05f;
     
            Vector2f currentReal = GetRealCoordinatesFor(mouseX, mouseY);
            double newCamZoom = CamZoom / ZoomFactor;
     
            //CamZoom /= 1.2f;
            // Min Zoom Value :
            // if(CamZoom<0.02f) CamZoom=0.02f;
     
            // on bride le zoom max à 10nanos pour la demi-hauteur (permet de distinguer jusqu'au nano)
            // sert à rien d'aller plus loin (problème de précision des flottants qui perturbe le zoom)
            if (newCamZoom > 1.0E-5F) CamZoom = newCamZoom;
     
            Vector2f newReal = GetRealCoordinatesFor(mouseX, mouseY);
     
            CamLookAt.x -= (newReal.x - currentReal.x);
            CamLookAt.y -= (newReal.y - currentReal.y);
     
            Vector2f confirmReal = GetRealCoordinatesFor(mouseX, mouseY);
    y a t'il un moyen de faire quelques chose de plus optimal?

    Es-tu forcée d'utiliser OpenGL 1.x ?
    je ne pense pas mais comment choisir la bonne version d'openGL? car mon application doit tournée sur certain vieux PC. Quelle est le standard utilisé aujourd'hui?

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 855
    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 855
    Points : 218 551
    Points
    218 551
    Billets dans le blog
    118
    Par défaut
    Pour utiliser d'autres versions d'OpenGL, il faut reprogrammer les appels à OpenGL.
    La première étape serait de transformer les glVertex() en VBO, comme je le disais. Vous pouvez trouver des tutoriels sur OpenGL moderne (version 3 et supérieur) dans cette série de tutoriels, ou encore celle-ci, merci dragonjoker59.

    Dans un monde 2D, l'écran (la zone affichée) peut être représentée par un rectangle. Il suffit de savoir si l'élément à afficher rentre dans ce rectangle, afin de déterminer si celui-ci doit vraiment être affiché.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

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

  6. #6
    Membre régulier
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

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

    Informations forums :
    Inscription : Février 2011
    Messages : 266
    Points : 86
    Points
    86
    Par défaut
    Alors je viens de lire tout les tutoriels que vous m'avez conseillé + quelques autres. Et donc je suis prête à changer de version OpenGl.
    Dites moi si je dis des bêtises.
    Alors d'après ce que j'ai compris je doit installer GLEW pour pouvoir utiliser les VBO. Donc j'ai télécharger GLEW a partir d'ici et j'ai tenté de suivre le manuel d'installation sur le site officiel en l'adaptant a mon IDE Borland c++ 6.0.

    A savoir Borland c++ 6.0 ne compile qu'en 32 bits et je suis sur un OS 64 bits
    j'ai donc mis :

    bin/glew32.dll dans %SystemRoot%\systemWow64
    lib/glew32.lib dans C:\Program Files (x86)\Borland\CBuilder6\Lib
    include/GL/glew.h dans C:\Program Files (x86)\Borland\CBuilder6\Include\Gl
    include/GL/wglew.h dans C:\Program Files (x86)\Borland\CBuilder6\Include\Gl

    je remplace mes includes à <Gl\gl.h> en <GL\glew.h>, je tente de compiler. Et là c'est le drame le compilateur me donne 3 erreurs :

    [C++ Error] glew.h(180): E2238 Multiplke declaration for 'ptrdiff_t'
    [C++ Error] stddefs.h(52): E2238 Multiplke declaration for 'ptrdiff_t'
    [C++ Error] glew.h(180): E2238 Multiplke declaration for 'ptrdiff_t'
    Pourriez vous venir à mon secours?

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 855
    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 855
    Points : 218 551
    Points
    218 551
    Billets dans le blog
    118
    Par défaut
    Je conseillerai déjà, de prendre un vrai EDI, tel que Code::Blocks.

    Après, ne jamais mettre les DLL dans les dossiers du système, c'est plutot une très mauvaise habitude. Ni mettre les .lib ou .h dans les dossiers du compilateur.
    Dans ce tutoriel, j'y explique comment installer une bibliothèque : http://alexandre-laurent.developpez....-bibliotheque/ (et cela n'est spécifique à aucune et marche théoriquement pour toute).
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

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

  8. #8
    Membre régulier
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

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

    Informations forums :
    Inscription : Février 2011
    Messages : 266
    Points : 86
    Points
    86
    Par défaut
    Je conseillerai déjà, de prendre un vrai EDI, tel que Code::Blocks.
    Concernant l'IDE je n'ai pas forcement le choix. Je dois reprendre un projet assez colossale, qui a été codé sous cette environnement de développement, et profitant ainsi des bibliothèque fournit avec...
    Mais il est prévu a long terme de refaire complètement ce projet avec QtCreator et sa biblioteque QT.

    Après, ne jamais mettre les DLL dans les dossiers du système, c'est plutot une très mauvaise habitude. Ni mettre les .lib ou .h dans les dossiers du compilateur.
    En générale c'est ce que je fait. Mais la j'ai voulu suivre le tutoriel a la lettre pour ne pas me tromper. Mais je ne pense pas que ce soit l'emplacement de mes fichiers qui me génère ces erreurs, si?

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 855
    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 855
    Points : 218 551
    Points
    218 551
    Billets dans le blog
    118
    Par défaut
    C'est vrai, j'ai un peu oublié les erreurs.
    Je me demande si ce n'est pas lié à l'ordre d'inclusion des entête. Il est souvent dit de mettre GLEW en premier et de ne pas inclure OpenGL après. Mais peut être c'est simplement car les .h de votre EDI sont trop anciens et sont devenus incompatibles. Je ne suis pas sur.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

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

  10. #10
    Membre régulier
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

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

    Informations forums :
    Inscription : Février 2011
    Messages : 266
    Points : 86
    Points
    86
    Par défaut
    Je me demande si ce n'est pas lié à l'ordre d'inclusion des entête. Il est souvent dit de mettre GLEW en premier et de ne pas inclure OpenGL après
    J'ai bien veillé à enlever les includes à glu.h et gl.h pour le laisser que ceux de glew.h

    Mais peut être c'est simplement car les .h de votre EDI sont trop anciens et sont devenus incompatibles.
    y aurai-t-il une solution pour régler ce problème?

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 855
    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 855
    Points : 218 551
    Points
    218 551
    Billets dans le blog
    118
    Par défaut
    Malheureusement, changé d'EDI et prendre Code::Blocks est une solution à laquelle je crois. Peut être je me trompe et le soucis ne vient pas de là
    Pouvez vous copier la liste d'include que vous faites, d'un des fichiers qui provoque l'erreur, s'il vous plait.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

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

  12. #12
    Membre régulier
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

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

    Informations forums :
    Inscription : Février 2011
    Messages : 266
    Points : 86
    Points
    86
    Par défaut
    Pouvez vous copier la liste d'include que vous faites, d'un des fichiers qui provoque l'erreur, s'il vous plait.
    voici le debut de mon point h là où ce fait mes includes. On voit bien que j'ai commenté la ligne concernant glu.h et que j'ai retiré celle a gl.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #ifndef GLEnvironnementH
    #define GLEnvironnementH
    #include <SysUtils.hpp>
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <gl/glew.h>
    //#include <gl/glu.h>
    #include <windows.h>
    #include <vector>
    #include "OpenGLControl.h"
    #include "Viewport.h"

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 855
    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 855
    Points : 218 551
    Points
    218 551
    Billets dans le blog
    118
    Par défaut
    Je ne sais pas, mais essayez de déplacer la ligne d'include de GLEW. Soit en premier, soit en dernier dans les include. Cela pourrait peut être aider. Mais c'est sans conviction
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

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

  14. #14
    Membre régulier
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

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

    Informations forums :
    Inscription : Février 2011
    Messages : 266
    Points : 86
    Points
    86
    Par défaut
    J'ai essayer de mettre l'include de glew.h tout en haut de la liste des includes, j'obtiens 4 erreurs au lieu de 3 mais ce sont les mêmes.
    Et lorsque je met l'include à la fin je retrouve mes trois erreurs.

    Bon je crois que l’amélioration par les vbo devra attendre la nouvelle version de l'application! :/
    En attendant je vais essayer je remplacer les appels simple au fonction standard fréquente, par des DisplayList.

  15. #15
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 045
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 045
    Points : 11 368
    Points
    11 368
    Billets dans le blog
    10
    Par défaut
    Pour avoir commencé OpenGL avec Borland c++ Builder 5.0, je peux dire que ça ne pose pas de problème.
    Après il reste que c'est vieux, mais c'est pas dramatique.
    De plus il n'est peut-etre pas possible de changer d'IDE, à cause des classes en venant (AnsiString pour ne citer qu'elle) et aussi s'il y a une IHM (là, beaucoup plus tendu de la changer).
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 855
    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 855
    Points : 218 551
    Points
    218 551
    Billets dans le blog
    118
    Par défaut
    Citation Envoyé par dragonjoker59 Voir le message
    Pour avoir commencé OpenGL avec Borland c++ Builder 5.0, je peux dire que ça ne pose pas de problème.
    Ok, je note. Mais du coup, avez vous une idée, pour l'erreur de compilation ?
    De plus il n'est peut-etre pas possible de changer d'IDE, à cause des classes en venant (AnsiString pour ne citer qu'elle) et aussi s'il y a une IHM (là, beaucoup plus tendu de la changer).
    Pour cela que j'aime pas Borland C++ Builder
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 13/02/2007, 14h32
  2. Réponses: 2
    Dernier message: 09/11/2006, 07h37
  3. Réponses: 5
    Dernier message: 20/08/2006, 02h55
  4. Configuration pour CAO (autocad)
    Par LE NEINDRE dans le forum Autres Logiciels
    Réponses: 6
    Dernier message: 02/06/2006, 09h36
  5. Besoin de routines ASM optimisées pour Delphi
    Par John Fullspeed dans le forum x86 32-bits / 64-bits
    Réponses: 11
    Dernier message: 08/12/2004, 21h00

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