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 :

Imagerie médicale - fuite de mémoire - affichage de plusieurs textures


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Mars 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 13
    Par défaut Imagerie médicale - fuite de mémoire - affichage de plusieurs textures
    Bonjour à tous, voilà j'ai un pti soucis je vous donne rapidement le contexte. Je suis étudiant et je dois réaliser un projet pour un hôpital concernant un logiciel d'imagerie médicale.

    Je ne suis pas responsable du choix des librairies et les deux librairies choisies ont donc été WxWidget couplé à de l'OPENGL.

    Je vous explique mes soucis plus concrètement maintenant. Pour afficher les images, je génère des cubes et je leur applique la texture que j'ai chargé au préalable. Mon problème.... mon code affiche et rafraîchis très bien jusqu'à 30 images... mais j'en ai plus de 80 à afficher... au delà... freeze de Linux... impossible à récupérer. Voilà mon 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
    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
     
    void GL_Window::drawPixels(Traitement *don)
    {
     
    	SetCurrent();				// On définit le Canvas comme le Canvas current
     
    	glMatrixMode(GL_MODELVIEW);
     
    	// Point de vue
    	gluLookAt(0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0);
     
    	// Initialisation, couleur de fond ...
    	glClearColor(0.0, 0.0, 0.0, 0.0);	// On efface la couleur actuelle
     
    	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);  //Efface le frame buffer et le Z-buffer 
     
    	glRotatef(180.0f, 180.0f, 0.0f, 0.0f);	// On effectue un flip horizontal du repère
     
    	glEnable(GL_DEPTH_TEST);		// On active les options de profondeurs
    	glDepthFunc(GL_LESS);			// pour les pixels
     
    	glPixelStorei(GL_UNPACK_ALIGNMENT, 1);	// On modifie le mode de stockage des pixels
     
    	// On build une texture2D
    	GLuint m_Textures_num = -1; 
    	glGenTextures(1,&m_Textures_num);
    	glBindTexture(GL_TEXTURE_2D,m_Textures_num);
     
    	//gluBuild2DMipmaps(GL_TEXTURE_2D, 3, 128, 128, GL_RGB, GL_UNSIGNED_BYTE, RGBA);
    	glTexImage2D(GL_TEXTURE_2D,0, GL_RGB, 128, 128, 0, GL_RGB, GL_UNSIGNED_BYTE, RGBA);
    	//delete image;
     	glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
    	glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
     	glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    	glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    	glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
    // 	glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND);
    	glEnable(GL_TEXTURE_2D);		// Activation des Textures2D
    // 	glShadeModel(GL_SMOOTH);			// Mode d'application
     
     
    	// On dessine le carré et on lui plaque la texture
    	GLfloat minX=-1.0,maxX=1.0f;
    	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    	glEnable(GL_COLOR_MATERIAL);
     
    	glBegin(GL_QUADS);
    	glTexCoord2f(0.0f, 0.0f);
    	glVertex2f(minX, minX); //glVertex3f(-0.20, -0.1, 0.0);
    	glTexCoord2f(0.0f, 1.0f);
    	glVertex2f(minX, maxX); //glVertex3f(-0.2, 0.1, 0.0);
    	glTexCoord2f(1.0f, 1.0f);
    	glVertex2f(maxX, maxX); //glVertex3f(0.0, 0.2, 0.0);
    	glTexCoord2f(1.0f, 0.0f);
    	glVertex2f(maxX, minX); //glVertex3f(0.0, -0.1, 0.0);
     
     	glEnd();
     
     
     	SwapBuffers();				// On affiche le buffer
    	// Libération des textures
    	cout << "Libération de la texture " << numero <<endl;
    	glDeleteTextures(1,&m_Textures_num);
    }
    Donc en plus de ne pas afficher plus de 30 images, mon programme subit de graves fuites de mémoires. Qqun voit le trou ? Le pointeur RGBA ne peut être supprimé puisqu'il pointe sur la structure de l'image et qu'au refresh, j'ai encore besoin de ce pointeur.

    Je précise que je dessine dans un wxCanvas... mais est-ce la peine ?

    Merci pour vos réponses... là perso, je craque... je ne vois ni la fuite de mémoire ni pourquoi il n'affiche pas plus de 30 images !

  2. #2
    Membre éprouvé Avatar de Harooold
    Homme Profil pro
    Ingénieur 3D temps réel
    Inscrit en
    Mars 2008
    Messages
    136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur 3D temps réel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2008
    Messages : 136
    Par défaut
    Je ne vois qu'un truc de bizarre, enfin, pour moi bizarre est ce que je ne comprend pas :p

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
    Je n'en vois pas vraiment l'utilité, essaie de le commenter :p

    Un autre petit truc qui pourrait bien être ta "fuite"

    quand tu fais glSwapBuffer, ça change de frame buffer actif.
    Pour que l'affichage soit fluide, normalement tu travailles avec 2 frame buffers, pendant qu opengl est en train de dessiner dans l'un, l'autre est affiché à l'écran. glSwapBuffer intervertis les deux.

    Sauf qu'il me semble que toutes les opérations opengl que tu fais sont prises en compte sur le buffer actif.
    Là tu crées une texture pour un frame buffer, tu switch et tu détruis la textures, mais comme tu as changé de frame buffer actif, la texture n'est pas détruite, et donc tu accumule petit à petit les textures.

    Ce n'est qu'un hypothèse mais essaie juste de mettre le glDeleteTexture avant le glSwapBuffer

  3. #3
    Membre habitué
    Inscrit en
    Mars 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 13
    Par défaut
    Tout d'abord merci Harooold pour ta réponse si rapide.

    Bon alors j'ai fait comme tu m'as dis, j'ai mis le glDeleteTextures avant de Swapper. Le petit test avec affiche de 20 images fonctionne mais le fait de recharger et décharger la vue m'indique qu'il y a toujours des fuites de mémoire puisque le programme ne perd que très peu de poids concernant la mémoire (vu à l'aide de la commande ps sous Linux)
    Le test à 40 image freeze toujours le PC ! Grrr !

    Je me suis aperçu que mon programme n'était pas clair si on avait pas l'architecture des objets. Voilà donc une petite architecture rapide :

    -> MyFrame : wxScrolledWindow
    -> Contient un vector<GL_Window* : wxGLCanvas>
    Dans le constructeur de MyFrame, on initialise chaque GL_Window du vecteur avec une adresse vers sa texture et ensuite on lui demande de faire un drawPixels (méthode précédemment jointe)

    J'suis toujours preneur de méthode plus adaptée pour faire ça ou de correction sur mon code. Si quelqu'un a encore des idées et comprend pourquoi ça bug je suis preneur à 100%.

    Merci merci merci merci merciii d'avance !

    Ps : Je me suis laissé pensé que ma carte graphique avait une limite de textures affichables ? Svp... dites moi que c'est pas possible !

  4. #4
    Membre éprouvé Avatar de Harooold
    Homme Profil pro
    Ingénieur 3D temps réel
    Inscrit en
    Mars 2008
    Messages
    136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur 3D temps réel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2008
    Messages : 136
    Par défaut
    Hm, je me suis jamais servi de wgwidgetruc, si le problème vient de là je ne pourrais pas t'aider

    Par contre qu'est ce que tu cherches à réaliser exactement ?
    Apriori tu aurais tout plein de fenêtres avec un contexte opengl avec dans chacune d'elle un quad sur lequel tu plaques une texture c'est ça ?

    Si c'est le cas il vaudrait mieux te débrouiller avec un seul contexte opengl, qui accederait à la carte graphique tout seul à la place d'en avoir 50 qui demandent des trucs à ta carte en même temps.

    Bref, explique en détails ce que tu cherches à réaliser

  5. #5
    Membre habitué
    Inscrit en
    Mars 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 13
    Par défaut
    Merci pour ton suivis Harooold.
    Voilà je te joint un lien vers une capture d'écran de mon projet. Ici

    Pourquoi donc est-ce que je me casse la tête à gérer ça dans des contextes opengl différents ? La question est posée...

    Réponse : Parce que chaque élément est indépendant. En faite je dois pouvoir faire tourner les objets, les redimmensionner, les faire bouger sans que ça n'influe sur les autres. Donc pas d'interférences... donc pas le même contexte openGL. Ca marche très bien pour une 20aine de contextes.. mais à 40 ça gèle vraiment tout le PC ! Un enfer je te dis...

    J'espère te relire très bientôt et que ton message commencera par : "Joe, j'ai une solution à ton problème..."

    Merci aussi à tous les volontaires pour me débugger..

  6. #6
    Membre très actif

    Profil pro
    Étudiant
    Inscrit en
    Décembre 2004
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2004
    Messages : 499
    Par défaut
    salut je vois pas bien le rapport entre pouvoir déplacer les 80 objets et avoir besoin de 80 contextes opengl

    tu peux très bien mettre les 80 dans le même contexte

Discussions similaires

  1. affichage sans fuite de mémoire
    Par kris1 dans le forum GTK+ avec C & C++
    Réponses: 1
    Dernier message: 27/11/2007, 18h21
  2. Réponses: 2
    Dernier message: 09/10/2004, 11h35
  3. [DirectDraw7] Affichage de plusieurs image bmp
    Par SteelBox dans le forum DirectX
    Réponses: 3
    Dernier message: 24/04/2004, 19h00
  4. Problème de mémoire Affichage images
    Par Repti dans le forum C++Builder
    Réponses: 6
    Dernier message: 29/03/2004, 20h06
  5. Réponses: 8
    Dernier message: 17/10/2002, 12h52

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