Amonchakai | Bonjour !
J'ai actuellement un petit soucis avec un de mes programme : au moment où je veut libérer la mémoire utilisée j'ai mon programme qui ne répond plus... . J'ai trouvé une solution mais j'aimerais bien avoir une explication de pourquoi ça ne marchait pas.
Voilà mon code, j'espère que vous trouverez ça pas trop indigeste...
Code :
- bool MapManager::Memorise(std::string s)
- {
- if(MapModel.find(s) == MapModel.end()) //Regarde si le model est a deja ete charge
- Load(s);
- if(MapModel[s].memorise) //si il a ete charge a-t-il deja ete memorise
- return true;
- MapModel[s].donnee_Array.reserve(MapModel[s].m_nbreMesh); //on alloue la memoire necessaire dans le vector
- for(int i = 0 ; i < MapModel[s].m_nbreMesh ; i++) //pour chacun des Mesh
- {
- Mesh_a_afficher Array;
- Array.VertexArray = new CVertex[MapModel[s].m_Meshes[i].m_numTriangles * 3]; //allocation de la memoire pour stocker les info a afficher
- Array.TexArray = new CTexCoord[MapModel[s].m_Meshes[i].m_numTriangles * 3];
- Array.NormalArray = new CNormal[MapModel[s].m_Meshes[i].m_numTriangles * 3];
- for(int j = 0 ; j < MapModel[s].m_Meshes[i].m_numTriangles ; j++) //pour tous les triangles
- {
- int triangleIndex = MapModel[s].m_Meshes[i].m_TrianglesIndices[j];
- for(int k = 0 ; k < 3 ; k++)
- {
- int index = MapModel[s].m_Triangles[triangleIndex].m_VertexIndices[k];
- try
- {
- Array.TexArray[3*j+k].u = MapModel[s].m_Triangles[triangleIndex].m_s[k]; //on remplit les tableaux qui vont etre donné
- Array.TexArray[3*j+k].v = MapModel[s].m_Triangles[triangleIndex].m_t[k]; //à la carte graphique
- Array.VertexArray[3*j+k].x = MapModel[s].m_vertices[index].m_position[0];
- Array.VertexArray[3*j+k].y = MapModel[s].m_vertices[index].m_position[1];
- Array.VertexArray[3*j+k].z = MapModel[s].m_vertices[index].m_position[2];
- Array.NormalArray[3*j+k].x = MapModel[s].m_Triangles[triangleIndex].m_VertexNormal[k][0];
- Array.NormalArray[3*j+k].y = MapModel[s].m_Triangles[triangleIndex].m_VertexNormal[k][1];
- Array.NormalArray[3*j+k].z = MapModel[s].m_Triangles[triangleIndex].m_VertexNormal[k][2];
- }
- catch(std::out_of_range &e)
- {
- MessageBox(NULL,e.what(),"",MB_OK);
- }
- }
- }
- MapModel[s].donnee_Array.push_back(Array); //on rajoute la mesh chargée dans le vector donne_array
- }
- MapModel[s].memorise = true; //Le model est alors chargé
- return true;
- }
- bool MapManager::Use(std::string s)
- {
- if(MapModel.find(s) == MapModel.end()) //le model a-t-il deja ete lu ?
- Memorise(s);
- if(MapModel[s].donnee_Array.size() != MapModel[s].m_nbreMesh) //le model a-t-il deja ete mémorisé ?
- Memorise(s);
- GLboolean texOn = glIsEnabled(GL_TEXTURE_2D);
- glEnable(GL_VERTEX_ARRAY);
- glEnable(GL_TEXTURE_COORD_ARRAY);
- glEnable(GL_NORMAL_ARRAY);
- for(int i = 0 ; i < MapModel[s].m_nbreMesh ; i++) //on affiche chacune des mesh
- {
- int materialIndex = MapModel[s].m_Meshes[i].m_MaterialIndex;
- if(materialIndex >= 0)
- {
- glMaterialfv(GL_FRONT, GL_AMBIENT, MapModel[s].m_Materials[materialIndex].m_ambient);
- glMaterialfv(GL_FRONT, GL_DIFFUSE, MapModel[s].m_Materials[materialIndex].m_diffuse);
- glMaterialfv(GL_FRONT, GL_SPECULAR, MapModel[s].m_Materials[materialIndex].m_specular);
- glMaterialfv(GL_FRONT, GL_EMISSION, MapModel[s].m_Materials[materialIndex].m_emissive);
- glMaterialf(GL_FRONT, GL_SHININESS, MapModel[s].m_Materials[materialIndex].m_luminosite);
- if(MapModel[s].m_Materials[materialIndex].m_NomTexture.length() > 0) //La mesh a-t-elle une texture ?
- {
- textureManager.Load(MapModel[s].m_Materials[materialIndex].m_NomTexture.data());
- glEnable(GL_TEXTURE_2D);
- }
- else
- glDisable(GL_TEXTURE_2D);
- }
- else
- glDisable(GL_TEXTURE_2D);
- glVertexPointer(3, GL_FLOAT, 0, MapModel[s].donnee_Array[i].VertexArray); //on affiche la Mesh
- glNormalPointer(GL_FLOAT, 0, MapModel[s].donnee_Array[i].NormalArray);
- glTexCoordPointer(2, GL_FLOAT, 0, MapModel[s].donnee_Array[i].TexArray);
- glDrawArrays(GL_TRIANGLES, 0, MapModel[s].m_Meshes[i].m_numTriangles * 3);
- }
- if(texOn) //on reviens dans le mode d'affichage precedent
- glEnable(GL_TEXTURE_2D);
- else
- glDisable(GL_TEXTURE_2D);
- glDisable(GL_VERTEX_ARRAY);
- glDisable(GL_TEXTURE_COORD_ARRAY);
- glDisable(GL_NORMAL_ARRAY);
- return true;
- }
- void MapManager::Release(std::string s)
- {
- if(MapModel.find(s)!=MapModel.end()) //le model est-il existant ?
- {
- std::vector<Mesh_a_afficher>::iterator it;
- it = MapModel[s].donnee_Array.begin();
- while(it != MapModel[s].donnee_Array.end()) //pour chacun des Mesh_a_afficher de donne_Array
- {
- delete[] (*it).NormalArray; //on libère la mémoire
- delete[] (*it).TexArray;
- delete[] (*it).VertexArray;
- it++;
- }
- MapModel[s].donnee_Array.clear(); //on supprime tous les Mesh_a_afficher
- MapModel.erase(s); //on supprime la Mesh désigné par s
- }
- }
|
Bon j'ai laissé la partie affichage, qui a l'air de bien marcher pour que vous puissiez voir pourquoi j'utilise pas un vector a la place de mes pointeurs sur les class CVertex, CTexCoord, CNormal
Bon pour l'info voilà a quoi ressemble ma class Mesh_a_afficher.
Code :
- class Mesh_a_afficher
- {
- public:
- CVertex *VertexArray;
- CTexCoord *TexArray;
- CNormal *NormalArray;
- /*
- ~Mesh_a_afficher()
- {
- delete[] VertexArray;
- VertexArray = NULL;
- delete[] TexArray;
- TexArray = NULL;
- delete[] NormalArray;
- NormalArray = NULL;
- }*/
- };
|
Vous pouvez noter que j'avais voulu faire les désallocation dans le destructeur de Mesh_a_afficher... Normalement ça aurrait du marcher non ?
Avec mes mon utilisation d'itérateurs il n'y a pas de soucis, mais j'aurrais plutôt voulu mettre la désalocation dans le destructeur...
Voilà ! Merci a ceux qui se pencheront sur mon problème Message édité par Amonchakai le 01-10-2006 à 19:15:49
|