Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

SDL_gfx i zasysanie coraz większej ilości pamięci przy obracaniu.

Ostatnio zmodyfikowano 2014-03-21 14:57
Autor Wiadomość
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:
C/C++
#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.
P-106900
maly
» 2014-03-21 13:19:56
rotozoomSurface
 zwraca nowe
SDL_Surface
 więc go musisz zawsze na końcu potraktować
SDL_FreeSurface
P-106901
remix2000
Temat założony przez niniejszego użytkownika
» 2014-03-21 14:29:55
Zrobiłem jak mówiłeś i "segmentation fault":
C/C++
#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;
}
P-106904
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.
P-106906
remix2000
Temat założony przez niniejszego użytkownika
» 2014-03-21 14:48:30
To samo :( Ja już nie mogę.
Oto kod:
C/C++
#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?
P-106907
maly
» 2014-03-21 14:57:08
trzeba ponownie załadować obrazek
Nie, wystarczy go nie usuwać.
P-106908
« 1 »
  Strona 1 z 1