[opengl]Pb: liberation mémoire textures [RESOLU]

Pb: liberation mémoire textures [RESOLU] [opengl] - C++ - Programmation

Marsh Posté le 17-07-2006 à 20:50:09    

Salut, petit problème de libération de mémoire dans mon moteur 3D (opengl)
je compile des textures grace à
 
glGenTextures
et
gluBuild2DMipmaps
 
et à la supression de la texture, on a un petit
 
glDeleteTextures
 
ps : j'ai vérifié que l'id de la texture est bien le meme pour le DeleteTextures que pour le gluBuild2DMipmaps.
 
Seulement, la texture n'a pas l'air d'être libérée... :??:
l'effet est assez important sachant que mon terrain se charge au fur et à mesur de la progression dans le monde, et qu'il se décharge derrière...
 
note : je suis sur que ca vient de ca, sachant qu'il n'y a absolument aucune autre fuite mémoire (j'ai implémenté un gestionaire de mémoire qui répertorie la mémoire non libérée à la fin de l'application), et qu'il n'y a aucun pb de mémoire qd je desactive les textures.
 
 
 

Code :
  1. //------------------ pour ceux que ca interesse, le code ---------------
  2. //note : c'est un moteur multithread... donc le mutex est normal ^^ la texture est compilée à sa première utilisation (donnée de l'image //précédement préchargée) rendering::logOGLerror marque l'erreur spécifiée dans un fichier s'il y a eu erreur d'opengl(yen a pas qd je compile...)
  3. GLuint texManager::getTextureID(value id)
  4. {
  5. criticalSection here(mutex);
  6. vector<texture>::iterator i = _findTex(id);
  7. if( i==textures.begin() )
  8. return 0;
  9. if( (*i).compiled == false )
  10. {
  11. GLuint type=GL_RGBA;
  12. glGenTextures(1, &(*i).texID);
  13. glBindTexture(GL_TEXTURE_2D, (*i).texID);
  14. if ((*i).bpp==24)
  15. {
  16. type=GL_RGB;
  17. }
  18. gluBuild2DMipmaps( GL_TEXTURE_2D, 4, (*i).width, (*i).height, type, GL_UNSIGNED_BYTE, (*i).imageData);
  19. glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  20. glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
  21. rendering::logOGLerror("texture manager.cpp","Erreur dans glTexImage2D" );
  22. (*i).compiled = true;
  23. free( (*i).imageData );
  24. (*i).imageData = NULL;
  25. }
  26. return (*i).texID;
  27. }
  28. //-------------------------------------------------------------------
  29. void texManager::unloadTexture(value id)
  30. {
  31. if( id.evalf() == 0 )
  32. return;
  33. criticalSection here(mutex);
  34. vector<texture>::iterator i = _findTex(id);
  35. if( i == textures.begin() )
  36. return;
  37. (*i).use --;
  38. if( (*i).use == 0 ) // si la texture n'est plus utilisée ...
  39. {
  40. if( (*i).imageData != NULL )
  41. free((*i).imageData); // ... on l'efface
  42. glDeleteTextures (1, &(*i).texID);
  43. textures.erase( i );
  44. }
  45. }


Message édité par icareo le 17-07-2006 à 23:20:36

---------------
tutos de programmation 3D :
Reply

Marsh Posté le 17-07-2006 à 20:50:09   

Reply

Marsh Posté le 17-07-2006 à 23:20:13    

problème résolu, erreur d'inatention : la supression de la texture est faite par le mauvais thread


---------------
tutos de programmation 3D :
Reply

Marsh Posté le 18-07-2006 à 00:33:56    

Au fait,

Code :
  1. ->

c'est super pratique, essayes  :o

Reply

Marsh Posté le 18-07-2006 à 17:19:01    

lol ... la blague.
c'est par choix que j'utilise "*" pour les iterators... histoire de les differencier des classes instanciées ...  
merci du conseil quand même ;)


---------------
tutos de programmation 3D :
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed