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 avec Java: Problème de lourdeur d'exécution


Sujet :

OpenGL

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    465
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 465
    Points : 154
    Points
    154
    Par défaut OpenGl avec Java: Problème de lourdeur d'exécution
    Salut,
    Je sui entrain de réaliser ne application OpenGL avec Java. j'utilise Jogl JSR 231. J'ai fait un prototype pour une maison en 3D . Mais le temps d'exécution de mon application est trés trés trés lourd. De telle sorte que mon ordinateur plante.
    1) est ce qu'il y a une technique pour optimiser une application OpenGL avec Java?
    2) J'utilise des textures automatiques, elles s'affichent sur les deux faces de chaque surface, comment afficher une texture sur une seule face de chaque surface?
    Merci.

  2. #2
    Expert éminent
    Avatar de raptor70
    Inscrit en
    Septembre 2005
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Septembre 2005
    Messages : 3 173
    Points : 6 812
    Points
    6 812
    Par défaut
    1) Je ne sais pas ... jamais fait d'OpenGL en Java

    par contre

    2) Il faut changer de texture entre tes faces. Il faut avoir un concept de sous-mesh dans un mesh. Chaque texture s'associe par sous-mesh.
    Mes Tutos DirectX, OpenGL, 3D : http://raptor.developpez.com/

  3. #3
    Expert éminent

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 813
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 813
    Points : 7 641
    Points
    7 641
    Par défaut
    Citation Envoyé par choko83 Voir le message
    1) est ce qu'il y a une technique pour optimiser une application OpenGL avec Java?
    D'habitude, y'a pas besoin. Surtout pour une scène simple.

    On pourrait avoir un peu plus de précisions?
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    465
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 465
    Points : 154
    Points
    154
    Par défaut
    Citation Envoyé par plegat Voir le message
    D'habitude, y'a pas besoin. Surtout pour une scène simple.

    On pourrait avoir un peu plus de précisions?
    En fait, moi mon objectif est de faire une scène trés compliquée à l'échelle d'une ville et non pas une seule maison. Mais, en essayant avec une seule maison, je me suis rendu compte que le temps d'éxécution est trés grand. Toutes animation se fait trés lentement et aprés l'ordinateur plante malgré que c'est un core duo avce 2GO de RAM. Voila

  5. #5
    Membre confirmé
    Inscrit en
    Février 2008
    Messages
    413
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Février 2008
    Messages : 413
    Points : 486
    Points
    486
    Par défaut
    Il faut que tu postes un peu de code, avec "j'affiche une maison mais c'est trop lent" on ne pourra pas beaucoup t'aider, ca peut venir de plein de choses différentes (OpenGL lui même, mais aussi Java).

    Comme Raptor je n'ai jamais fait d'OpenGL en Java. A l'époque on me l'avait déconseillé du fait d'un temps d'exécution assez lourd, donc je suis resté au c++. Je ne connais pas vraiment les limites, mais si tu veux afficher une grosse scène (comme ta ville) qui aurait déjà du mal en c++, je ne suis pas sûr que tu puisses arriver à quelque chose de rapide en java.

  6. #6
    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
    Citation Envoyé par choko83 Voir le message
    En fait, moi mon objectif est de faire une scène trés compliquée à l'échelle d'une ville et non pas une seule maison. Mais, en essayant avec une seule maison, je me suis rendu compte que le temps d'éxécution est trés grand. Toutes animation se fait trés lentement et aprés l'ordinateur plante malgré que c'est un core duo avce 2GO de RAM. Voila
    Oui mais dans le cas présent une grande partie de la ressource est basculer sur la carte graphique.

    Sinon au delà du débat JAVA ou PAS JAVA une telle lenteur n'est pas normal !

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    465
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 465
    Points : 154
    Points
    154
    Par défaut
    J'ai fait un test en enlevant les texture et ça marchait trés rapidement. Donc le problème est les textures. Sachant que mes textures sont automatiques (sans indiquer les coordonnées de textures), comment optimiser les textures?

  8. #8
    Membre confirmé
    Inscrit en
    Février 2008
    Messages
    413
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Février 2008
    Messages : 413
    Points : 486
    Points
    486
    Par défaut
    Tu veux vraiment pas lâcher ton code hein? bon ben bonne chance....

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    465
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 465
    Points : 154
    Points
    154
    Par défaut
    Citation Envoyé par ShevchenKik Voir le message
    Tu veux vraiment pas lâcher ton code hein? bon ben bonne chance....
    C'est pas qestion que je veux pas lacher mon code, mais j'utilise beaucoup de classe donc la compréhension du code n'est pas évidente. Mais voilà un petit bout de code. La méthode qui permet de générer automatiquement une texture est la suivante:
    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
     
    public void tackleAutomaticTexture(GL gl)
    {
    	float ObjPlaneS[] = { 1.0f, 0.0f, 1.0f, 0.0f };
    	float ObjPlaneT[] = { 0.0f, 1.0f, 0.0f, 0.0f };
    	float ObjPlaneR[] = { 0.0f, 0.0f, 1.0f, 0.0f };
    	float ObjPlaneQ[] = { 0.0f, 0.0f, 0.0f, 1.0f };
     
    	gl.glEnable(GL.GL_TEXTURE_GEN_S); // Auto Texture Generation
    	gl.glEnable(GL.GL_TEXTURE_GEN_T);
    	gl.glTexGeni( GL.GL_S, GL.GL_TEXTURE_GEN_MODE, GL.GL_OBJECT_LINEAR );
    	gl.glTexGeni( GL.GL_T, GL.GL_TEXTURE_GEN_MODE, GL.GL_OBJECT_LINEAR );
    		gl.glTexGenfv(GL.GL_S, GL.GL_OBJECT_PLANE, ObjPlaneS,0);
    	gl.glTexGenfv(GL.GL_T, GL.GL_OBJECT_PLANE, ObjPlaneT,0);
    	}
    Et la création d'une forme (triangle, quad...) texturée se fait comme ça:
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
     
    gl.glEnable(GL.GL_TEXTURE_2D);
    TextureLoader.Texture tex1 = null;
    ..................
    else
    	{
    		tackleAutomaticTexture(gl);
     
    		try 
            {
    	      tex1 = TextureLoader.readTexture(TextureURL);
            } 
            catch(IOException e) 
            {
    	      System.err.println("Unable to load texture : "+ TextureURL);
            }
            if( tex1 != null )
    	     PolyLineTexture = tex1.toGL(gl,glu,false);
             else
    	     PolyLineTexture = -1;
     
     
            // 2.1) We draw a Triangle 
            if(form.toUpperCase().equals("TRIANGLE"))
     	   {
     		    gl.glBindTexture(GL.GL_TEXTURE_2D, PolyLineTexture);
            	gl.glBegin(GL.GL_TRIANGLES);
        		gl.glNormal3f(0,0,1.0f);
     
     
     	    for (int i=0;i< 3;i++)
     	    { 
     
     	    	gl.glVertex3d(getPoint(i).getX(),getPoint(i).getY(),getPoint(i).getZ());	
     	    }
     	    gl.glEnd();
     	    }
     
         // 2.2) We draw a Quad
     	   if(form.toUpperCase().equals("QUAD"))
     	   {
     		gl.glCullFace(GL.GL_FRONT);
     
     
     		gl.glBegin(GL.GL_QUADS);
     		gl.glNormal3f(0,0,1.0f);
     	    for (int i=0;i<4;i++)
     	    {   
     	    	gl.glVertex3d(getPoint(i).getX(),getPoint(i).getY(),getPoint(i).getZ());
     	    }
     	    gl.glEnd();
     	    }
     	   // 2.3) We draw a Polygon
     	  if(form.toUpperCase().equals("POLYGON"))
    	   {
     		// gl.glCullFace(GL.GL_FRONT);
     
     
      		gl.glBegin(GL.GL_POLYGON);
      		gl.glNormal3f(0,0,1.0f);
      	    for (int i=0;i<ThePolyLinePoints.size();i++)
      	    {   
      	    	gl.glVertex3d(getPoint(i).getX(),getPoint(i).getY(),getPoint(i).getZ());
      	    }
      	    gl.glEnd();
    	    }
     	 disableAutomaticTexture(gl);
     	 PolyLineTexture = -1;
    	 }

  10. #10
    Membre confirmé
    Inscrit en
    Février 2008
    Messages
    413
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Février 2008
    Messages : 413
    Points : 486
    Points
    486
    Par défaut
    Ah ben voilà, avec ca on peut commencer!

    Là par exemple, sauf erreur de ma part tu crées tes textures à chaque frame, alors qu'il faudrait les créer une fois pour toute au debut de l'application, puis n'utiliser que des glBindTexture pour changer de texture entre les dessins de tes différents objets.

    Creer une texture prend beaucoup de temps, commence par essayer de corriger ca

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    465
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 465
    Points : 154
    Points
    154
    Par défaut
    En fait, mes formes (triangles, quads..) ainsi que leurs textures (url) sont enregistrées dans une Base de Données. Pour optimiser (éviter de faire de vas et des viens avec la Base de Données) je télécharge les formes et les textures dans des vecteur (tabeau). Et aprés je parcours ces vecteurs case par case et à chaque fois je dessine la forme avec la texture correspondante.
    J'ai pas compris le fait que tu m'as dit :
    alors qu'il faudrait les créer une fois pour toute au debut de l'application, puis n'utiliser que des glBindTexture pour changer de texture entre les dessins de tes différents objets.

  12. #12
    Membre confirmé
    Inscrit en
    Février 2008
    Messages
    413
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Février 2008
    Messages : 413
    Points : 486
    Points
    486
    Par défaut
    je veux dire que cette partie du code
    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
    gl.glEnable(GL.GL_TEXTURE_2D);
    TextureLoader.Texture tex1 = null;
    ..................
    else
    	{
    		tackleAutomaticTexture(gl);
     
    		try 
            {
    	      tex1 = TextureLoader.readTexture(TextureURL);
            } 
            catch(IOException e) 
            {
    	      System.err.println("Unable to load texture : "+ TextureURL);
            }
            if( tex1 != null )
    	     PolyLineTexture = tex1.toGL(gl,glu,false);
             else
    	     PolyLineTexture = -1;
    n'a besoin d'etre executée qu'une seule fois, donc sors-là de ta fonction d'affichage qui, elle, est appelée à chaque frame. Mets-là après ton initialisation OpenGL par exemple.

    Avec ta structure de base de donnée / tableaux:
    1. Intialise OpenGL
    2. Parcours ton tableau et charge chaque texture. Il faut juste que tu enregistre la textureID de chaque texture quelque part, disons dans un autre tableau
    3. Après, dans ta fonction d'affichage, tu fais juste un glBindTexture en passant la textureID correspondante à l'objet que tu dessines

    Sinon, d'un point de vue performances je ne suis pas sûr que parcourir des tableaux soit le plus efficace, mais pour commencer essaie de t'occuper des textures, à mon avis c'est le plus gros problème pour le moment

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    465
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 465
    Points : 154
    Points
    154
    Par défaut
    T'as raison ShevchenKik, j'ai fait sortir le fonction de téléchargement de texture de ma méthode de frame et ça marche trés bien. Merci.
    Si non, t'as entendu parler des DisplayList? Selon la documentation, elle permet d'optimiser le calcul OpenGL.

Discussions similaires

  1. divers problème avec Java et jdbc
    Par chti_juanito dans le forum JDBC
    Réponses: 28
    Dernier message: 31/10/2005, 16h54
  2. Réponses: 2
    Dernier message: 17/10/2005, 14h58
  3. Réponses: 2
    Dernier message: 11/05/2005, 13h23
  4. Réponses: 5
    Dernier message: 18/03/2005, 20h10
  5. comment utiliser de l'OpenGL avec du Java ?
    Par DjiZ dans le forum OpenGL
    Réponses: 3
    Dernier message: 14/01/2004, 15h21

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