fuite de mémoire!

fuite de mémoire! - C++ - Programmation

Marsh Posté le 16-08-2005 à 20:05:34    

Salut!
Je programme un jeu de combat avec OpenGl et Glut et lorsque j'appelle cette fonction, le gestionnaire des taches de windows m'indique que la mémoire utilisée par mon processus grimpe en flèche (je passe environ de 50 Mo à 120 Mo):
 

Code :
  1. using namespace std;
  2. #include <iostream>
  3. #include <direct.h>
  4. #include "baston.hpp"
  5. extern GLubyte tex_ciel[2048*2048*4], tex_sol[2048*2048*4];
  6. extern GLubyte tex_devant[1024*1024*4], tex_derriere[1024*1024*4];
  7. extern GLubyte tex_droite[1024*1024*4],tex_gauche[1024*1024*4];
  8. extern GLuint textures_skybox[6];
  9. extern int nb_mondes;
  10. extern int monde_en_cours;
  11. //------------------------------------------------------------------------------
  12. //-------------------------INITIALISATION DE LA SKYBOX--------------------------
  13. //------------------------------------------------------------------------------
  14. void init_skybox()
  15. {
  16.     int i,j,k;
  17.     FILE *fich;
  18.     char nomonde[3];
  19.     char monde[15];
  20.    
  21.     GLubyte en_tete[37];
  22.    
  23.     glEnable(GL_TEXTURE_2D);     
  24.     glGenTextures(6,textures_skybox);
  25.    
  26.    
  27.     //Répertoires pour les textures
  28.     strcpy(monde,"monde" );
  29.     to_char(monde_en_cours,monde+5);//ajoute le numéro du monde à la fin de monde
  30.    
  31.  
  32.     //Choix du répertoire en cours
  33.     chdir(monde);
  34.      
  35.     //ciel:
  36.     fich=fopen("ciel.bmp","rb" ); 
  37.     if(fich==NULL) exit(0);
  38.    
  39.     fread (en_tete,1,54,fich);
  40.    
  41.     for(i=0;i<2048;i++)
  42.     {
  43.         for(j=0;j<2048;j++)
  44.         {
  45.             fread(&tex_ciel[(i*2048+j)*4+2],sizeof(GLubyte),1,fich);
  46.             fread(&tex_ciel[(i*2048+j)*4+1],sizeof(GLubyte),1,fich);
  47.             fread(&tex_ciel[(i*2048+j)*4+0],sizeof(GLubyte),1,fich);
  48.             tex_ciel[(i*2048+j)*4+3]=255;
  49.         }
  50.     }     
  51.     glBindTexture(GL_TEXTURE_2D,textures_skybox[0]);
  52.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  53.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  54.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT );
  55.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT );
  56.     glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,2048,2048,0,GL_RGBA,GL_UNSIGNED_BYTE,tex_ciel);
  57.    
  58.     //sol:
  59.     fich=fopen("sol.bmp","rb" );
  60.     if(fich==NULL) exit(0);
  61.    
  62.     fread (en_tete,1,54,fich);
  63.    
  64.     for(i=0;i<2048;i++)
  65.     {
  66.         for(j=0;j<2048;j++)
  67.         {
  68.             fread(&tex_sol[(i*2048+j)*4+2],sizeof(GLubyte),1,fich);
  69.             fread(&tex_sol[(i*2048+j)*4+1],sizeof(GLubyte),1,fich);
  70.             fread(&tex_sol[(i*2048+j)*4+0],sizeof(GLubyte),1,fich);
  71.             tex_sol[(i*2048+j)*4+3]=255;
  72.         }
  73.     }
  74.    
  75.     fclose (fich); 
  76.     glBindTexture(GL_TEXTURE_2D,textures_skybox[1]);
  77.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  78.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  79.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT );
  80.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT );
  81.     glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,2048,2048,0,GL_RGBA,GL_UNSIGNED_BYTE,tex_sol);
  82.    
  83.     //derriere:
  84.     fich=fopen("derriere.bmp","rb" );
  85.     if(fich==NULL) exit(0);
  86.    
  87.     fread (en_tete,1,54,fich);
  88.    
  89.     for(i=0;i<1024;i++)
  90.     {
  91.         for(j=0;j<1024;j++)
  92.         {
  93.             fread(&tex_derriere[(i*1024+j)*4+2],sizeof(GLubyte),1,fich);
  94.             fread(&tex_derriere[(i*1024+j)*4+1],sizeof(GLubyte),1,fich);
  95.             fread(&tex_derriere[(i*1024+j)*4+0],sizeof(GLubyte),1,fich);
  96.             tex_derriere[(i*1024+j)*4+3]=255;
  97.         }
  98.     }
  99.    
  100.     fclose (fich); 
  101.     glBindTexture(GL_TEXTURE_2D,textures_skybox[2]);
  102.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  103.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  104.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT );
  105.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT );
  106.     glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,1024,1024,0,GL_RGBA,GL_UNSIGNED_BYTE,tex_derriere);
  107.    
  108.     //devant:
  109.     fich=fopen("devant.bmp","rb" );
  110.     if(fich==NULL) exit(0);
  111.    
  112.     fread (en_tete,1,54,fich);
  113.    
  114.     for(i=0;i<1024;i++)
  115.     {
  116.         for(j=0;j<1024;j++)
  117.         {
  118.             fread(&tex_devant[(i*1024+j)*4+2],sizeof(GLubyte),1,fich);
  119.             fread(&tex_devant[(i*1024+j)*4+1],sizeof(GLubyte),1,fich);
  120.             fread(&tex_devant[(i*1024+j)*4+0],sizeof(GLubyte),1,fich);
  121.             tex_devant[(i*1024+j)*4+3]=255;
  122.         }
  123.     }
  124.    
  125.     fclose (fich); 
  126.     glBindTexture(GL_TEXTURE_2D,textures_skybox[3]);
  127.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  128.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  129.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT );
  130.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT );
  131.     glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,1024,1024,0,GL_RGBA,GL_UNSIGNED_BYTE,tex_devant);
  132.    
  133.     //gauche:
  134.     fich=fopen("gauche.bmp","rb" );
  135.     if(fich==NULL) exit(0);
  136.    
  137.     fread (en_tete,1,54,fich);
  138.    
  139.     for(i=0;i<1024;i++)
  140.     {
  141.         for(j=0;j<1024;j++)
  142.         {
  143.             fread(&tex_gauche[(i*1024+j)*4+2],sizeof(GLubyte),1,fich);
  144.             fread(&tex_gauche[(i*1024+j)*4+1],sizeof(GLubyte),1,fich);
  145.             fread(&tex_gauche[(i*1024+j)*4+0],sizeof(GLubyte),1,fich);
  146.             tex_gauche[(i*1024+j)*4+3]=255;
  147.         }
  148.     }
  149.    
  150.     fclose (fich); 
  151.     glBindTexture(GL_TEXTURE_2D,textures_skybox[4]);
  152.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  153.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  154.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT );
  155.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT );
  156.     glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,1024,1024,0,GL_RGBA,GL_UNSIGNED_BYTE,tex_gauche); 
  157.    
  158.     //droite:
  159.     fich=fopen("droite.bmp","rb" );
  160.     if(fich==NULL) exit(0);
  161.    
  162.     fread (en_tete,1,54,fich);
  163.    
  164.     for(i=0;i<1024;i++)
  165.     {
  166.         for(j=0;j<1024;j++)
  167.         {
  168.             fread(&tex_droite[(i*1024+j)*4+2],sizeof(GLubyte),1,fich);
  169.             fread(&tex_droite[(i*1024+j)*4+1],sizeof(GLubyte),1,fich);
  170.             fread(&tex_droite[(i*1024+j)*4+0],sizeof(GLubyte),1,fich);
  171.             tex_droite[(i*1024+j)*4+3]=255;
  172.         }
  173.     }
  174.    
  175.     fclose (fich); 
  176.     glBindTexture(GL_TEXTURE_2D,textures_skybox[5]);
  177.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  178.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  179.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT );
  180.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT );
  181.     glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,1024,1024,0,GL_RGBA,GL_UNSIGNED_BYTE,tex_droite);
  182.    
  183.    
  184.     chdir(".." );
  185. }


 
Pourtant je n'ai aucune allocation dynamique puisque mes tableaux ont des tailles fixes et sont déclarés variables globales dans le .cpp principal
 
merci


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 16-08-2005 à 20:05:34   

Reply

Marsh Posté le 16-08-2005 à 20:47:35    

#  for(i=0;i<2048;i++)
#     {
#         for(j=0;j<2048;j++)
#         {
#             fread(&tex_ciel[(i*2048+j)*4+2],sizeof(GLubyte),1,fich);
#             fread(&tex_ciel[(i*2048+j)*4+1],sizeof(GLubyte),1,fich);
#             fread(&tex_ciel[(i*2048+j)*4+0],sizeof(GLubyte),1,fich);
#             tex_ciel[(i*2048+j)*4+3]=255;
#         }
#     }        
 
 
c'est idiot tout ça, tu veux faire tout en un seul fread. idem pour le reste. beurk les variables globales aussi grosse. avec des BMP, tu peux meme faire du mappage mémoire directe :)

Reply

Marsh Posté le 16-08-2005 à 20:49:19    

GLubyte en_tete[37];
 
...
 
 fread (en_tete,1,54,fich);
 
 
perdu

Reply

Marsh Posté le 16-08-2005 à 20:50:55    

Je ne sais pas si les lignes suivantes sont la cause du problème, mais en tous cas, il y a là un petit bug.

  GLubyte en_tete[37];  
 ...
    fread (en_tete,1,54,fich);  


Il faudrait que "en_tete" soit déclaré avec au moins 54 octets, sinon il y a un débordement sur les zones mémoires voisines. :)
 
Edit : T'es trop rapide, Taz !


Message édité par olivthill le 16-08-2005 à 20:52:09
Reply

Marsh Posté le 17-08-2005 à 12:13:08    

Sinon une fois que tu as instancié tes textures, ça sert a rien de garder une copie des images. Donc tu peux abandonner tes gros tableaux globaux, utiliser un tableau dynamique assez grand (pour réutiliser le meme pour toutes les faces) au moment du loading et le virer proprement à la fin du Init.

Reply

Marsh Posté le 17-08-2005 à 13:47:45    

Ok je croyais que openGl se servait de mes tableaux pour les textures par la suite.
Pour le fread 54 dans un tableau de 37  c'est une petite erreur c'est 0x37 dsl. (j'ai compté l'en-tete dans mon éditeur hexa et forcément j'ai l'offset en hexa...
Tout s'arrange merci. En fait je ne savais pas qu'OpenGl chargait mes textures en mem et du coup je me souçiais pas des textures. Erreur fatale, il manquait:
glDeleteTextures(6,textures_skybox);
d'où la fuite de memoire.
Merci bien!!!


---------------
deluser --remove-home ptitchep
Reply

Sujets relatifs:

Leave a Replay

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