icareo | 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 :
- //------------------ pour ceux que ca interesse, le code ---------------
- //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...)
- GLuint texManager::getTextureID(value id)
- {
- criticalSection here(mutex);
- vector<texture>::iterator i = _findTex(id);
- if( i==textures.begin() )
- return 0;
- if( (*i).compiled == false )
- {
- GLuint type=GL_RGBA;
- glGenTextures(1, &(*i).texID);
- glBindTexture(GL_TEXTURE_2D, (*i).texID);
- if ((*i).bpp==24)
- {
- type=GL_RGB;
- }
- gluBuild2DMipmaps( GL_TEXTURE_2D, 4, (*i).width, (*i).height, type, GL_UNSIGNED_BYTE, (*i).imageData);
- glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
- rendering::logOGLerror("texture manager.cpp","Erreur dans glTexImage2D" );
- (*i).compiled = true;
- free( (*i).imageData );
- (*i).imageData = NULL;
- }
- return (*i).texID;
- }
- //-------------------------------------------------------------------
- void texManager::unloadTexture(value id)
- {
- if( id.evalf() == 0 )
- return;
- criticalSection here(mutex);
- vector<texture>::iterator i = _findTex(id);
- if( i == textures.begin() )
- return;
- (*i).use --;
- if( (*i).use == 0 ) // si la texture n'est plus utilisée ...
- {
- if( (*i).imageData != NULL )
- free((*i).imageData); // ... on l'efface
- glDeleteTextures (1, &(*i).texID);
- textures.erase( i );
- }
- }
|
Message édité par icareo le 17-07-2006 à 23:20:36 ---------------
tutos de programmation 3D :
|