remix2000 Temat założony przez niniejszego użytkownika |
SDL_gfx i zasysanie coraz większej ilości pamięci przy obracaniu. » 2014-03-21 13:03:08 Witam! Otóż mam taki mały programik o kodzie: #include "SDL.h" #include "SDL_gfxPrimitives.h" #include "SDL_rotozoom.h"
const int WINDOW_WIDTH = 640; const int WINDOW_HEIGHT = 480;
const char * WINDOW_TITLE = "SDL;";
int main( int argc, char ** argv ) { SDL_Init( SDL_INIT_VIDEO ); SDL_Surface * screen = SDL_SetVideoMode( WINDOW_WIDTH, WINDOW_HEIGHT, 0, SDL_HWSURFACE | SDL_DOUBLEBUF );;\ SDL_Surface * imgm = SDL_LoadBMP( "lda.bmp" ); SDL_Surface * rotate; SDL_Rect amb; SDL_WM_SetCaption( WINDOW_TITLE, 0 ); SDL_Event event; bool running = true; float ang = 0.; while( running ) { rotate = rotozoomSurface( imgm, ang, 1., 0.); if( ang < 720 ) { ang += 2; } else { ang = 0; } amb.x = 300 - floor( rotate->w / 2 ); amb.y = 300 - floor( rotate->h / 2 ); amb.w = rotate->w; amb.h = rotate->h; if( SDL_PollEvent( & event ) ) { if( event.type == SDL_QUIT ) { running = false; } } boxRGBA( screen, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, 0, 0, 0, 255 ); SDL_BlitSurface( rotate, NULL, screen, & amb ); SDL_Flip( screen ); } SDL_Quit(); return 0; }
i on zachowuje się bardzo dziwnie. Mianowicie od chwili włączenia htop pokazuje coraz większe użycie pamięci oraz wyokie użycie procesora. Czy da się to jakoś naprawić? A może to wina linuxa(arch)? Z góry dziękuję. PS: Nie jestem pewien czy to dobry dział, jeśli nie to proszsę o przeniesienie. |
|
maly |
» 2014-03-21 13:19:56 rotozoomSurface zwraca nowe SDL_Surface więc go musisz zawsze na końcu potraktować SDL_FreeSurface |
|
remix2000 Temat założony przez niniejszego użytkownika |
» 2014-03-21 14:29:55 Zrobiłem jak mówiłeś i "segmentation fault": #include "SDL.h" #include "SDL_gfxPrimitives.h" #include "SDL_rotozoom.h"
const int WINDOW_WIDTH = 640; const int WINDOW_HEIGHT = 480;
const char * WINDOW_TITLE = "SDL;";
int main( int argc, char ** argv ) { SDL_Init( SDL_INIT_VIDEO ); SDL_Surface * screen = SDL_SetVideoMode( WINDOW_WIDTH, WINDOW_HEIGHT, 0, SDL_HWSURFACE | SDL_DOUBLEBUF ); SDL_Surface * imgm = SDL_LoadBMP( "lda.bmp" ); SDL_FreeSurface( imgm ); SDL_Surface * rotate; SDL_Rect amb; SDL_WM_SetCaption( WINDOW_TITLE, 0 ); SDL_Event event; bool running = true; float ang = 0.; while( running ) { rotate = rotozoomSurface( imgm, ang, 1., 0.); SDL_FreeSurface( rotate ); if( ang < 360 ) { ang += 1; } else { ang = 0; } amb.x = 300 - floor( rotate->w / 2 ); amb.y = 300 - floor( rotate->h / 2 ); amb.w = rotate->w; amb.h = rotate->h; if( SDL_PollEvent( & event ) ) { if( event.type == SDL_QUIT ) { running = false; } } boxRGBA( screen, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, 0, 0, 0, 255 ); SDL_BlitSurface( rotate, NULL, screen, & amb ); SDL_Flip( screen ); } SDL_Quit(); return 0; }
|
|
maly |
» 2014-03-21 14:43:52 Stworzyłeś SDL_Surface i odrazu go usunąłeś, SDL_FreeSurface miałeś dać gdzieś na końcu kiedy nie będzie ci już potrzebny, najprościej na końcu pętli. |
|
remix2000 Temat założony przez niniejszego użytkownika |
» 2014-03-21 14:48:30 To samo :( Ja już nie mogę. Oto kod: #include "SDL.h" #include "SDL_gfxPrimitives.h" #include "SDL_rotozoom.h"
const int WINDOW_WIDTH = 640; const int WINDOW_HEIGHT = 480;
const char * WINDOW_TITLE = "SDL;";
int main( int argc, char ** argv ) { SDL_Init( SDL_INIT_VIDEO ); SDL_Surface * screen = SDL_SetVideoMode( WINDOW_WIDTH, WINDOW_HEIGHT, 0, SDL_HWSURFACE | SDL_DOUBLEBUF ); SDL_Surface * imgm = SDL_LoadBMP( "lda.bmp" ); SDL_Surface * rotate; SDL_Rect amb; SDL_WM_SetCaption( WINDOW_TITLE, 0 ); SDL_Event event; bool running = true; float ang = 0.; while( running ) { rotate = rotozoomSurface( imgm, ang, 1., 0.); if( ang < 360 ) { ang += 2; } else { ang = 0; } amb.x = 300 - floor( rotate->w / 2 ); amb.y = 300 - floor( rotate->h / 2 ); amb.w = rotate->w; amb.h = rotate->h; if( SDL_PollEvent( & event ) ) { if( event.type == SDL_QUIT ) { running = false; } } boxRGBA( screen, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, 0, 0, 0, 255 ); SDL_BlitSurface( rotate, NULL, screen, & amb ); SDL_Flip( screen ); SDL_FreeSurface( imgm ); SDL_FreeSurface( rotate ); } SDL_Quit(); return 0; } Proszę o pomoc. EDIT: Jestem jakiś nie taki dzisiaj trzeba ponownie załadować obrazek :P Ale dalej ciągnie procesor(>50%). Czy to normalne? |
|
maly |
» 2014-03-21 14:57:08 trzeba ponownie załadować obrazek |
Nie, wystarczy go nie usuwać. |
|
« 1 » |