Pour l'affichage de mon sol, j'ai essayé d'implémenter un Octree, voici le code, pour l'instant je n'ai fait que le constructer et le destructeur :

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
/**********************************************************************************************************
 * Constructeur par defaut
 **********************************************************************************************************/
Octree::Octree(Point3D p, GLfloat size) : d_p(p), d_size(size) {
 /* Si on est trop grand pour contenir des faces alors, on cree des octree fils */
 if(d_size > d_min_size){
  /* On reserve la place memoire */
  d_fils.reserve(8);
 
  /* Les 4 du haut */
  d_fils.push_back(Octree(Point3D(d_p.d_x, d_p.d_y, d_p.d_z), (d_size / 2)));
  d_fils.push_back(Octree(Point3D(d_p.d_x, d_p.d_y, d_p.d_z - (d_size / 2)), (d_size / 2)));
  d_fils.push_back(Octree(Point3D(d_p.d_x + (d_size / 2), d_p.d_y, d_p.d_z), (d_size / 2)));
  d_fils.push_back(Octree(Point3D(d_p.d_x + (d_size / 2), d_p.d_y, d_p.d_z - (d_size / 2)), (d_size / 2)));
 
  /* Les 4 du bas */
  d_fils.push_back(Octree(Point3D(d_p.d_x, d_p.d_y - (d_size / 2), d_p.d_z), (d_size / 2)));
  d_fils.push_back(Octree(Point3D(d_p.d_x, d_p.d_y - (d_size / 2), d_p.d_z - (d_size / 2)), (d_size / 2)));
  d_fils.push_back(Octree(Point3D(d_p.d_x + (d_size / 2), d_p.d_y - (d_size / 2), d_p.d_z), (d_size / 2)));
  d_fils.push_back(Octree(Point3D(d_p.d_x + (d_size / 2), d_p.d_y - (d_size / 2), d_p.d_z - (d_size / 2)), (d_size / 2)));
 }else{
  /* Sinon cet octree est assez petit pour contenir des faces, alors on reserve de la place pour le vecteur de faces */
  d_faces.reserve(0);
 } 
}
 
 
/**********************************************************************************************************
 * Destructeur par defaut
 **********************************************************************************************************/
Octree::~Octree() {
 /* Si on etait assez petit pour avoir des faces, il faut les effacer */
 if(d_size <= d_min_size){
  d_faces.clear();
 }else{
  /* Sinon on a cree des octree fils, il faut les effacer aussi */
  d_fils.clear();
 }
}
Comme vous pouvez le voir, si l'octree est inférieur à une taille minimale qui est 2.0, alors on reserve de la place pour les futures faces qu'on va lui affecter. S'il est plus grand que 2, on crée 8 octree fils, plus petit de moitié, et on les met dans un vecteur.

Le gros problème, c'est que quand l'octree de base fait 200 de taille, ca prend un temps fou pour que l'octree complet se crée, ca prend 15 Mo de mémoire!!! et lorsque je supprime le monde courant, il reste 1 Mo en mémoire, que je n'arrive pas à effacer.

Est ce quelqu'un qui connait bien le C++, pourrait me dire d'où vient ce problème de mémoire, comment faire pour que ça se crée le plus rapidement possible et que la mémoire se libère complêtement?

Dans Point3D, il n'y a que les coordonnées x,y,z et u,v pour les textures, rien d'autres...