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

3D Java Discussion :

Out of memory


Sujet :

3D Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 43
    Par défaut Out of memory
    Rebonjour à tous et merci pour l'aide

    Cependant un autre problème surgit. En fait mon programme lance une JFrame 3D pour visualiser un volume en 3D. Puis par une interface graphique je choisis une autre fonction et désire donc retracer mon volume. Pour cela je ferme ma Jframe avec la méthode indiquée auparavant mais au moment de réouvrir une nouvelle fenêtre j'obtiens system out of memory. Ce volume tracé séparément ne provoque pas de telle erreur.

    Comment puis je résoudre ce problème sans relancer à chaque fois tout le programme?

    merci d'avance


    sujet modéré: fusion avec le sujet réponse

  2. #2
    Expert confirmé

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 817
    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 817
    Par défaut Re: Out of memory
    Salut,

    Citation Envoyé par fontaigo
    Pour cela je ferme ma Jframe avec la méthode indiquée auparavant
    C'est bien gentil, mais vu que c'est le premier message du post, c'est quand "auparavant"?
    Et c'est quoi la méthode? dispose() ou setVisible(false)?


    Citation Envoyé par fontaigo
    Comment puis je résoudre ce problème sans relancer à chaque fois tout le programme?
    En cherchant à quel endroit tu bouffes de la mémoire pour rien...
    En nous montrant le code incriminé...
    En nous expliquant un peu plus en détail comment tu fais tout ce que tu viens d'expliquer...

    Si tu as fait un setVisible(false), il vaut mieux passer par un setVisible(true) plutôt que de créer un nouvel objet... sinon tu risques d'exploser ta mémoire!
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  3. #3
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 43
    Par défaut RE Out of Memory
    désolé pour mes imprécisions, je vais essayer d'être plus clair.

    Je fait un programme qui fait de l'estimation de volume. pour cela je prends un volume d'origine englobant celui à calculer. Je le découpe et teste les petits pavés obtenus. Ainsi j'arrive à estimer le volume d'une Sphere, d'un Tetraedre ou de tout volume en 3D dont j'ai l'équation Cartésienne. On comprends bien que pour obtenir de bons résultats je coupe énormément et arrive souvent en limite de mémoire.

    la deuxième phase du programme est un affichage en 3D. Le problème est que j'affiche plusieurs centaines de petits pavés et met à rude épreuve la mémoire. Je me suis donc mis en limite de précision pour obtenir une représentation intéressante.

    Maintenant j'aimerais faire une petite interface permettant de changer de volume par exemple (sphère ellipsoide Cube Tetraedre) avec des boutons. Je lance donc le programme avec deux frames. La première avec les centaines de petits paves représentant le volume en 3D et une deuxième fenêtre permettant de changer de volume. J'ai donc écrit une espèce de méthode Repaint() qui ferme la fenêtre en java3D et qui ensuite relance l'élaboration d'un nouveau volume 3D par l'association des centtaines de petits pavés.

    Séparément les différents volumes(sphere tetraedre ellipsoide) ne font pas sauter la mémoire mais le fait de fermer la fenêtre3D puis de la relancer provoque un out of memory
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public void repeindre(){
    	Interface3D.dispose();
    	new Interface3D(f).setVisible(true);
             }
    Comment régler ce problème??

    merci pour votre aide

  4. #4
    Expert confirmé

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 817
    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 817
    Par défaut Re: RE Out of Memory
    Citation Envoyé par fontaigo
    Comment régler ce problème??
    tu as déclaré ton dispose() en static? Vu comment tu l'appelles, on dirait que oui... c'est étrange...

    On pourrait voir ta classe Interface3D? si c'est pas trop long (sinon, juste la méthode dispose()...)
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  5. #5
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 43
    Par défaut
    Je n'ai pas écrit la méthode dispose elle appartient à l'API et s'applique aux JFrame.

    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
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
     
     
    public class Interface3D extends javax.swing.JFrame {
     
        private SimpleUniverse univ = null;
        private BranchGroup scene = null;
        private javax.swing.JPanel drawingPanel;
     
        public void genere_volume_3d(int n,Fonction f,Appearance app,TransformGroup objTrans){
    		double[] coordonnee=new double[n];
    		double[] longueurs=new double[n];
    		coordonnee[0]=-6;
    		coordonnee[1]=-6;
    		coordonnee[2]=-6;
    		longueurs[0]=12;
    		longueurs[1]=12;
    		longueurs[2]=12;
    		NodePave root=new NodePave(coordonnee,longueurs,2);
    		ArbrePaves a=new ArbrePaves(root,f);
    		a.coupe_k(root,n,5);
    		a.test(root,n);
    		a.affinage_fin(root,n,2);
    		genere_paves3d(root,n,app,objTrans);
    	}
     
        public void genere_paves3d(NodePave noeud,int n,Appearance app,TransformGroup objTrans){
    		if(noeud.getLeft()==null & noeud.getRight()==null){
    			if(noeud.getIn_or_Out()==2){
    				affiche_pave(noeud,app,objTrans);
    			}
    		}
    		else if (noeud.getLeft()!=null & noeud.getRight()==null){
    			genere_paves3d(noeud.getLeft(),n,app,objTrans);
    		}
    		else if (noeud.getLeft()==null & noeud.getRight()!=null){
    			genere_paves3d(noeud.getRight(),n,app,objTrans);
    		}
    		else{
    			genere_paves3d(noeud.getLeft(),n,app,objTrans);
    			genere_paves3d(noeud.getRight(),n,app,objTrans);
    		}
    	}
     
        public void affiche_pave(NodePave noeud, Appearance app, TransformGroup objTrans){
        	Transform3D cubeMat = new Transform3D();
        	TransformGroup cubeTrans = new TransformGroup(cubeMat);
        	float Xp=(float)(noeud.getCoordonnee()[0]/9);
        	float Yp=(float)(noeud.getCoordonnee()[1]/9);
        	float Zp=(float)(noeud.getCoordonnee()[2]/9); 
        	float Lx=(float)(noeud.getLongueurs()[0]/9);
        	float Ly=(float)(noeud.getLongueurs()[1]/9);
        	float Lz=(float)(noeud.getLongueurs()[2]/9);
        	cubeMat.set(new Vector3d(Xp+Lx/2.0,Yp+Ly/2.0,Zp+Lz/2.0));
        	cubeTrans.setTransform(cubeMat);
        	cubeTrans.addChild(new Box(Lx,Ly,Lz,app));
            objTrans.addChild(cubeTrans);
     
        }
     
        public BranchGroup createSceneGraph(int n,Fonction f) {
        	BranchGroup objRoot = new BranchGroup();
     
        	TransformGroup objTrans = new TransformGroup();
        	objRoot.addChild(objTrans);
     
        	BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0);
     
        	Color3f col1=new Color3f(0.5f,0.0f,0.0f);
        	Vector3f vect1=new Vector3f(0.5f,0.5f,0.5f);
        	DirectionalLight dl1=new DirectionalLight(true,col1,vect1);
        	dl1.setInfluencingBounds(new BoundingSphere());
        	objRoot.addChild(dl1);
     
        	Color3f col2=new Color3f(0.0f,0.5f,0.0f);
        	Vector3f vect2=new Vector3f(-0.5f,-0.5f,-0.5f);
        	DirectionalLight dl2=new DirectionalLight(true,col2,vect2);
        	dl2.setInfluencingBounds(new BoundingSphere());
        	objRoot.addChild(dl2);
     
        	Color3f col3=new Color3f(0.0f,0.0f,0.5f);
        	Vector3f vect3=new Vector3f(-0.5f,-0.5f,0.5f);
        	DirectionalLight dl3=new DirectionalLight(true,col3,vect3);
        	dl3.setInfluencingBounds(new BoundingSphere());
        	objRoot.addChild(dl3);
     
        	Color3f col4=new Color3f(0.5f,0.5f,0.5f);
        	Vector3f vect4=new Vector3f(0.0f,0.0f,+0.5f);
        	DirectionalLight dl4=new DirectionalLight(true,col4,vect4);
        	dl2.setInfluencingBounds(new BoundingSphere());
        	objRoot.addChild(dl4);
     
        	Material m=new Material();
     
        	Appearance app = new Appearance();
        	app.setMaterial(m);
     
        	genere_volume_3d(n,f,app,objTrans);
     
        	objRoot.compile();
     
        	return objRoot;
        }
     
        private Canvas3D createUniverse() {
        	    	GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
     
        	Canvas3D c = new Canvas3D(config);
     
        	univ = new SimpleUniverse(c);
     
        	univ.getViewingPlatform().setNominalViewingTransform();
     
        	univ.getViewer().getView().setMinimumFrameCycleTime(5);
     
        	return c;
        }
     
        public Interface3D(Fonction fo) {
        	Fonction f=fo;
        	int n=3;
        	initComponents();
     
        	Canvas3D c = createUniverse();
        	drawingPanel.add(c, java.awt.BorderLayout.CENTER);
     
        	scene = createSceneGraph(n,f);
        	ViewingPlatform viewingPlatform = univ.getViewingPlatform();
     
        	univ.getViewingPlatform().setNominalViewingTransform();
     
        	OrbitBehavior orbit = new OrbitBehavior(c, OrbitBehavior.REVERSE_ALL);
        	BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0);
        	orbit.setSchedulingBounds(bounds);
        	viewingPlatform.setViewPlatformBehavior(orbit);
     
     
        	univ.addBranchGraph(scene);
        }
     
        private void initComponents() {
            drawingPanel = new javax.swing.JPanel();
            setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
     
            setTitle("Interface3D");
            drawingPanel.setLayout(new java.awt.BorderLayout());
            drawingPanel.setPreferredSize(new java.awt.Dimension(700,700));
     
            getContentPane().add(drawingPanel, java.awt.BorderLayout.CENTER);
     
            pack();
        }
     
     
        public static void main(String args[]) {
            java.awt.EventQueue.invokeLater(new Runnable() {
                public void run() {
                	Fonction fo=new Astroide();
                    new Interface3D(fo).setVisible(true);
                }
            });
        }
     
    }

  6. #6
    Expert confirmé

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 817
    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 817
    Par défaut
    Citation Envoyé par fontaigo
    Je n'ai pas écrit la méthode dispose elle appartient à l'API et s'applique aux JFrame.
    Ok, ok, mais vu la manière dont tu l'appelles, tu ne fais pas de dispose() sur un objet... donc la fenêtre que tu fermes est toujours en mémoire. Il faut faire un dispose() sur ton objet fenêtre si tu veux récupérer la place mémoire.
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  7. #7
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 43
    Par défaut
    Je ne déclare plus ma JFrame Interface3D en static pourtant le problème persiste. Ma JFrame Interface3D est une variable d'instance de ma classe IHM. Je l'initialise dans le constructeur de IHM et apllique la méthode dispose() dans la méthode repeindre avant de la redéfinir avec une nouvelle fonction voila le code en question
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    private JFrame Interface3D=null;
    //déclaration de la variable d'instance

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public void repeindre(){
    	Interface3D.dispose();
    	Interface3D=new Interface3D(f);
        	Interface3D.setVisible(true);
    	}
    //la méthode repeindre est appelé lorsque j'appuye sur un bouton
    //d'une nouvelle fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public IHM() {
    	super();
    	Fonction f0=new Sphere();
        	Interface3D=new Interface3D(f0);
        	Interface3D.setVisible(true);
    	initialize();
    	}
    //constructeur de ma classe IHM ou j'initialise la Jframe Interface3D

    Merci d'avance

Discussions similaires

  1. [XStream][String]out of memory
    Par Invité dans le forum Persistance des données
    Réponses: 8
    Dernier message: 10/01/2006, 14h52
  2. [C++] [gcc] out of memory
    Par fxp17 dans le forum GCC
    Réponses: 5
    Dernier message: 06/01/2006, 10h29
  3. [pb mémoire] out of memory d'eclipse
    Par Casp dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 12/05/2005, 16h39
  4. Out of memory
    Par shurato dans le forum ANT
    Réponses: 1
    Dernier message: 10/11/2004, 16h19
  5. [JBuilder 8] Out of memory problem ...
    Par keros dans le forum JBuilder
    Réponses: 2
    Dernier message: 08/09/2003, 19h03

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