Bonjour, sela fait plusieures jours que je tente de trouver la source d'un problème dans mon application.
Il emblerais que au fure et a mesure que mon aplication tourne elle prène de plus en plus de mémoire, puis apprès que le fichier d'échange windows est été étendu, elle finis par plenter.
J'en ai donbc dédui que sela venais de la construction d'objet en chaine dans une boucle, enfaite pour mieux comprendre mon programme, il faut avoir qu'une classe gère les maps, et la fonction MonInstanceMap->BlitSurface(ecran); est apeller en boucle dan draw();
J'ai beau chercher, je me rend compte que le ralentissement apparait que l'orsque la surface de la map a une taille conséquente, pourtant avent que je change quelques petites choses dedan, elle fonctioner parfaitement avec une vitesse de 60FPS. J'ai eu beau passer en commentaire toute mes modification, le problème se prouit et je n'arive pas a toruver la source.
Je me reporte donc a vos conaissences pour m'aider a localiser ce problème.
Voici la partie que je juge importante du code :
Main.cpp
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63 int main (int argc, char *argv[]) { //... //Simulation de load d'une map : Carte = new Sprit_Map::basic_map( "data/tst.map" ); Carte->unserialize( "data/tst_2.map" ); Carte->MakeSurface(); //fin de simulation W_SDL_done = 0; while (!W_SDL_done) { SDL_Event event; //Renvoi au fonctions de gestion while (SDL_PollEvent (&event)) { switch (event.type) { case SDL_KEYDOWN: case SDL_KEYUP: keyboard(); break; case SDL_QUIT: W_SDL_done = 1; break; case SDL_MOUSEMOTION: case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONUP: mouse(); break; default: break; } } //Dessin de l'écran draw (); } //... } void draw () { bug_log((std::string)" draw(); FPS = " + t_std::to_dec(FPS::base_FPS::GetInstance().CalcFPS()) + (std::string)"\n");//De-Bug //Netoyage de l'écran : SDL_FillRect(screen, NULL, SDL_BGColor); //Teste de la map : std::cerr << "Carte->BlitSurface(screen); ::::: " << Carte->BlitSurface(screen) << "\n"; //FPS FPS::base_FPS::GetInstance().ShowFPS( screen, Width_S, Height_S ); //Echange des buffers SDL_Flip (screen); //Pause de 0MiliSeconde SDL_Delay (0); }
Map.cpp
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75 Sprit_Map::basic_map::basic_map( std::string _file ) { serialize(_file); } Sprit_Map::basic_map::~basic_map( ) { SDL_FreeSurface(Screen); } bool Sprit_Map::basic_map::serialize( std::string _file ) { //Open std::ifstream Map_Load( _file.c_str() ); if(!Map_Load || Map_Load == NULL){return false;} //Name std::getline( Map_Load, name, '|'); //Width std::string width_s; std::getline( Map_Load, width_s, '|' ); t_std::from_string( width_s, width ); //Height std::string height_s; std::getline( Map_Load, height_s, '|' ); t_std::from_string( height_s, height ); //Alpha std::string alpha_s; std::getline( Map_Load, alpha_s, '|' ); t_std::from_string( alpha_s, alpha ); /* Code que j'ai passer en commentaire car il s'ocupe de créer d'autres objet imbriquer les un dans les autres qui contiènent la map sous forme de block ect.. Mais que je ne fait pas fonctioner l'hor des testes! */ return true; } bool Sprit_Map::basic_map::unserialize( std::string _file ) { //Open std::ofstream Map_UnLoad( _file.c_str() ); if(!Map_UnLoad || Map_UnLoad == NULL){return false;} //Name Map_UnLoad << name << '|'; //Width Map_UnLoad << width << '|'; //Height Map_UnLoad << height << '|'; //Alpha Map_UnLoad << alpha << '|'; /* Code que j'ai passer en commentaire car il s'ocupe de créer d'autres objet imbriquer les un dans les autres qui contiènent la map sous forme de block ect.. Mais que je ne fait pas fonctioner l'hor des testes! */ return true; } bool Sprit_Map::basic_map::BlitSurface(SDL_Surface *screen_r) { if(screen_r == NULL){return false;} if(Screen == NULL) if(!MakeSurface()){return false;} SDL_BlitSurface(Screen, NULL, screen_r, NULL); return true; } bool Sprit_Map::basic_map::MakeSurface() { if(Screen == NULL) Screen = SDL_AllocSurface( SDL_SRCALPHA , width*32, height*32, 32, r_mask, g_mask, b_mask, a_mask); if(Screen == NULL){return false;} Uint32 RGB_BACK = SDL_MapRGB(Screen->format, 255, 255, 255); SDL_FillRect(Screen, NULL, RGB_BACK); /* Code que j'ai passer en commentaire car il s'ocupe de créer d'autres objet imbriquer les un dans les autres qui contiènent la map sous forme de block ect.. Mais que je ne fait pas fonctioner l'hor des testes! */ SDL_SetAlpha(Screen, SDL_SRCALPHA, alpha); return true; }
Un FPS afficher a 12/17/16... Alors que dans un cas normale le FPS afiche des chifres avoisinan 60, et surtout les chifres change extrèmement rapidement(parfois on ne voi que la disaine mais on n'arive pas a distinguer l'unitée) aulieu de cette actuèle "freez".
Les résultats du débug sont :
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120 ############################## # START # # Project Fantasy # # 0.1 # ############################## mouse(); mouse(); draw(); FPS = 1 draw(); FPS = 100 draw(); FPS = 166 mouse(); draw(); FPS = 142 draw(); FPS = 166 draw(); FPS = 166 draw(); FPS = 166 draw(); FPS = 111 draw(); FPS = 166 draw(); FPS = 166 draw(); FPS = 200 draw(); FPS = 166 draw(); FPS = 166 draw(); FPS = 200 draw(); FPS = 250 draw(); FPS = 200 draw(); FPS = 200 draw(); FPS = 200 draw(); FPS = 200 draw(); FPS = 200 draw(); FPS = 166 draw(); FPS = 200 draw(); FPS = 166 draw(); FPS = 166 draw(); FPS = 200 draw(); FPS = 142 draw(); FPS = 166 draw(); FPS = 166 draw(); FPS = 200 mouse(); draw(); FPS = 166 mouse(); draw(); FPS = 166 mouse(); draw(); FPS = 200 mouse(); draw(); FPS = 166 mouse(); draw(); FPS = 166 mouse(); draw(); FPS = 166 mouse(); draw(); FPS = 166 mouse(); draw(); FPS = 111 mouse(); mouse(); draw(); FPS = 166 mouse(); draw(); FPS = 166 draw(); FPS = 166 keyboard(); keyboard(); draw(); FPS = 21 draw(); FPS = 166 draw(); FPS = 142 draw(); FPS = 142 mouse(); mouse(); mouse(); draw(); FPS = 100 draw(); FPS = 17 mouse(); draw(); FPS = 111 keyboard(); keyboard(); draw(); FPS = 90 draw(); FPS = 142 draw(); FPS = 166 keyboard(); keyboard(); draw(); FPS = 142 mouse(); mouse(); mouse(); mouse(); draw(); FPS = 76 mouse(); draw(); FPS = 166 mouse(); draw(); FPS = 166 mouse(); draw(); FPS = 200 mouse(); draw(); FPS = 166 mouse(); draw(); FPS = 166 mouse(); keyboard(); keyboard(); keyboard(); keyboard(); draw(); FPS = 200 keyboard(); keyboard(); mouse(); draw(); FPS = 142 mouse(); mouse(); draw(); FPS = 166 mouse(); mouse(); draw(); FPS = 166 draw(); FPS = 166 keyboard(); keyboard(); keyboard(); draw(); FPS = 166 ############################## # END # ##############################
Partager