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

Koniec pamięci masowe = koniec programu, co robić?

Ostatnio zmodyfikowano 2013-03-01 17:53
Autor Wiadomość
ziajek444
Temat założony przez niniejszego użytkownika
Koniec pamięci masowe = koniec programu, co robić?
» 2013-02-28 20:28:14
Mam fajny kodzik, i planuje go dalej rozwijać ale zauważyłem że mi się gra wyłącza po kilku minutach. Poczytałem trochę fora i doszedłem do wniosku że coś w moim kodzie ciągle zwiększa zużycie pamięci, i jak zużyje całą to się wyłącza. Proszę pomóżcie gdzie ten "zbój" w moim kodzie?

Podejrzewam pętle (while);
P.S. Śmiało pozwalam skopiować kod i sprawdzić go u siebie (pisany w allegro 4.4.2)

C/C++
#include <allegro.h>

BITMAP * bufor;
class postac
{
protected:
    int txr[ 10 ];
    int txl[ 10 ];
    int ty[ 10 ];
   
    int poz_x;
    int poz_y;
    bool left;
    BITMAP * ludek;
    BITMAP * ludek2;
    BITMAP * bg;
   
public:
    void standing( int poz_x, int poz_y, bool left, BITMAP * ludek2, BITMAP * ludek, BITMAP * bg );
    void walking( int poz_x, int poz_y, bool left, BITMAP * ludek2, BITMAP * ludek, BITMAP * bg );
    void jumping( int poz_x, int poz_y, bool left, BITMAP * ludek2, BITMAP * ludek, BITMAP * bg );
};
void bitbifot()
{
    bufor = create_bitmap( 800, 600 );
   
};


void postac::standing( int poz_x, int poz_y, bool left, BITMAP * ludek2, BITMAP * ludek, BITMAP * bg )
{
    txr[ 0 ] = 0;
    txr[ 1 ] = 80;
    txr[ 2 ] = 160;
    txr[ 3 ] = 240;
    ty[ 0 ] = 0;
    //ty[1]=80;
    txl[ 0 ] = 720;
    txl[ 1 ] = 720 - 80;
    txl[ 2 ] = 720 - 160;
    txl[ 3 ] = 720 - 160 - 80;
   
   
    int static klatka_x = 0;
    int static klatka_y = 0;
    int static a = 1;
   
    if( a == 0 ) klatka_x--;
   
    if( a == 1 ) klatka_x++;
   
    if( klatka_x == 3 ) a = 0;
   
    if( klatka_x == 0 ) a = 1;
   
    if( left == false ) masked_blit( ludek, bufor, txr[ klatka_x ], 0, poz_x, poz_y, 60, 80 );
   
    if( left == true ) masked_blit( ludek2, bufor, txl[ klatka_x ], 0, poz_x, poz_y, 60, 80 );
   
};

void postac::walking( int poz_x, int poz_y, bool left, BITMAP * ludek2, BITMAP * ludek, BITMAP * bg )
{
    txr[ 4 ] = 320;
    txr[ 5 ] = 400;
    txr[ 6 ] = 480;
    txr[ 7 ] = 560;
    ty[ 0 ] = 0;
    //ty[1]=80;
    txl[ 4 ] = 720 - 160 - 160;
    txl[ 5 ] = txl[ 4 ] - 80;
    txl[ 6 ] = txl[ 5 ] - 80;
    txl[ 7 ] = txl[ 6 ] - 80;
   
    int static klatka_x = 4;
    int static klatka_y = 0;
    int static a = 1;
   
    if( a == 0 ) klatka_x--;
   
    if( a == 1 ) klatka_x++;
   
    if( klatka_x == 7 ) a = 0;
   
    if( klatka_x == 3 ) a = 1;
   
   
    if( left == false ) masked_blit( ludek, bufor, txr[ klatka_x ], 0, poz_x, poz_y, 60, 80 );
   
    if( left == true ) masked_blit( ludek2, bufor, txl[ klatka_x ], 0, poz_x, poz_y, 60, 80 );
    //blit(bufor, screen, 0, 0, 0, 0, bufor->w, bufor->h);
};




int main()
{
    allegro_init();
    install_keyboard();
   
    set_color_depth( 16 );
    set_gfx_mode( GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0 );
   
    BITMAP * ludek = load_bmp( "davis_0.bmp", default_palette );
    BITMAP * ludek2 = load_bmp( "davis_0_m.bmp", default_palette );
    BITMAP * ludeka = load_bmp( "freeze_0.bmp", default_palette );
    BITMAP * ludek2a = load_bmp( "freeze_0_m.bmp", default_palette );
    BITMAP * bg = load_bmp( "bground.bmp", default_palette );
   
   
    postac marcin, ziajek;
   
    bitbifot(); //deklaracja bitmapy bufor
    int poz_x = 100;
    int poz_y = 200;
    int poz_x2 = 400;
    int poz_y2 = 300;
    bool left = false;
    bool left2 = true;
    bool go = false;
    bool go2 = false;
   
    /*
    clear_to_color( bufor, makecol( 255, 0, 255 ) );
    bg = load_bmp( "bground.bmp", default_palette );
    if(go==false) marcin.standing(poz_x,poz_y,left2,ludek2,ludek,bg);
    if(go==false) ziajek.standing(poz_x2,poz_y2,left2,ludek2a,ludeka,bg);
    if(go==true) marcin.walking(poz_x,poz_y,left,ludek2,ludek,bg);
    if(go2==true) ziajek.walking(poz_x2,poz_y2,left2,ludek2a,ludeka,bg);
    masked_blit(bufor, bg, 0, 0, 0, 0, bg->w, bg->h);
    blit(bg, screen, 0, 0, 0, 0, bg->w, bg->h);
    */
   
   
    rest( 2000 );
    while( !key[ KEY_ESC ] )
    { //while
       
        go2 = false;
        go = false;
       
        if( key[ KEY_LEFT ] )
        {
            go = true;
            left = true;
            poz_x -= 10;
        }
        if( key[ KEY_RIGHT ] )
        {
            go = true;
            left = false;
            poz_x += 10;
        }
        if( key[ KEY_UP ] )
        {
            go = true;
            poz_y -= 10;
        }
        if( key[ KEY_DOWN ] )
        {
            go = true;
            poz_y += 10;
        }
        if( key[ KEY_A ] )
        {
            go2 = true;
            left2 = true;
            poz_x2 -= 10;
        }
        if( key[ KEY_D ] )
        {
            go2 = true;
            left2 = false;
            poz_x2 += 10;
        }
        if( key[ KEY_W ] )
        {
            go2 = true;
            poz_y2 -= 10;
        }
        if( key[ KEY_S ] )
        {
            go2 = true;
            poz_y2 += 10;
        }
       
        clear_to_color( bufor, makecol( 255, 0, 255 ) );
        bg = load_bmp( "bground.bmp", default_palette );
        if( go == false ) marcin.standing( poz_x, poz_y, left, ludek2, ludek, bg );
       
        if( go2 == false ) ziajek.standing( poz_x2, poz_y2, left2, ludek2a, ludeka, bg );
       
        if( go == true ) marcin.walking( poz_x, poz_y, left, ludek2, ludek, bg );
       
        if( go2 == true ) ziajek.walking( poz_x2, poz_y2, left2, ludek2a, ludeka, bg );
       
        masked_blit( bufor, bg, 0, 0, 0, 0, bg->w, bg->h );
        blit( bg, screen, 0, 0, 0, 0, bg->w, bg->h );
       
        rest( 20 ); //trzeba tak zrobić żeby ludzik nakładał się na bitmape dostępną w funkcjach i int_main, a potem na bg i potem na screen.
    } //while
   
   
   
   
   
    readkey();
   
    destroy_bitmap( bufor );
    destroy_bitmap( bg );
    destroy_bitmap( ludek );
    destroy_bitmap( ludek2 );
    destroy_bitmap( ludeka );
    destroy_bitmap( ludek2a );
   
    return 0;
}
END_OF_MAIN();
P-77337
DejaVu
» 2013-02-28 20:37:32
Pamięć masowa to pamięć np. dysku twardego. RAM nie jest pamięcią masową, tylko co najwyżej pamięcią podręczną komputera. Skoro zużycie pamięci systematycznie rośnie to znaczy, że systematycznie nie zwalniasz jakichś zasobów.
P-77338
Chlorek
» 2013-02-28 20:56:36
Sprawdź gdzie wczytujesz jakieś dane przy każdym obiegu głównej pętli, być może coś się powtarza wiele razy bez potrzeby.
P-77340
SeaMonster131
» 2013-02-28 21:00:31
Poczytałem trochę fora i doszedłem do wniosku że coś w moim kodzie ciągle zwiększa zużycie pamięci, i jak zużyje całą to się wyłącza.
Jeżeli masz Windowsa, uruchom Menadżer zadań. Tam masz wypisane ile pamięci oraz ile % CPU zżera Twoja aplikacja.

Po drugie w pętli głównej wczytujesz cały czas bitmapę:
C/C++
bg = load_bmp( "bground.bmp", default_palette );
Zaraz po sprawdzeniu wciśniętych klawiszy.
P-77341
ziajek444
Temat założony przez niniejszego użytkownika
» 2013-03-01 16:02:25
A jak mam inaczej czyścić bitmapę "bg"?


Nigdy bym nie wpadł (a jednak wpadłem na to) żeby dać to :
bg = load_bmp( "bground.bmp", default_palette );
do funkcji. Jak czyszcze z funkcji to nie zmniejsza tej pamięci.

Tak dla zamknięcia tematu to funkcja wygląda tak:

C/C++
void cls_( BITMAP * bg )
{
    bg = load_bmp( "bground.bmp", default_palette );
    clear_to_color( bufor, makecol( 255, 0, 255 ) );
};

Zczytuje bitmape "bg", potem ją czyści (przy okazji dodałem czyszczenie bufora którego nie muszę zczytywać do funkcji bo jest globalny). Następnie druga funkcja:

C/C++
void destro( BITMAP * bg )
{
    destroy_bitmap( bg );
};

Zcztuje bitmape "bg", i ją niszczy zwalniając miejsce. :)

NOWY TEMAT W TEMACIE
Zastanawiam się jeszcze czy można jakoś przenieść zczytaną zmienną z cls_() do destro() żeby do destro dodatkowo nie zczytywać za każdym razem.
N.T.W.T.
P-77363
ison
» 2013-03-01 17:53:25
Nigdy nie wczytuj bitmapy w pętli.

A jak mam inaczej czyścić bitmapę "bg"?
clear_to_color?
P-77372
« 1 »
  Strona 1 z 1