Autor Wątek: Program przestał działać-problem z pamięcią  (Przeczytany 1549 razy)

Offline Dante

  • Użytkownik

# Sierpień 01, 2013, 16:27:26
Piszę grę w Allegro 4 i natknąłem się na problem, który jest związany z funkcją, odpowiedzialną za rysowanie mapy. Mapa oczywiście w postaci kafelków( tablica o wymiarach 40x25 ), każdy kafelek o rozmiarach 120x120. W funkcji mam 2 fory, a w forach ify, odpowiadające poszczególnym kaflom z tilesetu(bmp). No i niby wszystko śmiga, mapa się wyświetla, scroll działa, tylko po pewnym czasie( kilka sekund ) program przestaje działać i wyświetla się stosowny komunikat. Pamięć fizyczna szaleje, gdy wcisnę w menu przycisk opcję "nowa gra"( po wciśnięciu wyświetla się mapa ), dochodzi ona do ok. 80% i wtedy gra się crashuje i wywala ten błąd. Czy możliwe jest to, że rozmiar tablicy jest za duży i przez to gra zżera aż tyle pamięci?

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline maro

  • Użytkownik

# Sierpień 01, 2013, 16:31:08
Coś gdzieś wycieka... nie tworzysz za każdym razem nowych bitmap?

Offline czoper

  • Użytkownik
    • czoper.devlog

# Sierpień 01, 2013, 16:32:10
Czy możliwe jest to, że rozmiar tablicy jest za duży i przez to gra zżera aż tyle pamięci?

Najprawdopodobniej co klatkę tworzysz kilkaset (??) nowych obiektów i ich nie zwalniasz -> zapycha się pamięć.

Pokaż kod rysowania mapy

Offline Dante

  • Użytkownik

# Sierpień 01, 2013, 16:33:33
void Map::DrawLevel1( BITMAP* tlo, int mapx, int mapy )
{
    tiles1 = load_bmp("data/Maps/school.bmp", default_palette);


    for( int w=0; w<25; w++ )
      for( int k=0; k<40; k++ )
      {

            if( map1[w][k] == 0 ) blit( tiles1, tlo, 0, 0, mapx + k*120, mapy + w*120, 120, 120 );
            else if( map1[w][k] == 1 ) blit( tiles1, tlo, 120, 0, mapx + k*120, mapy + w*120, 120, 120 );
            else if( map1[w][k] == 2 ) blit( tiles1, tlo, 240, 0, mapx + k*120, mapy + w*120, 120, 120 );
            else if( map1[w][k] == 3 ) blit( tiles1, tlo, 360, 0, mapx + k*120, mapy + w*120, 120, 120 );
            else if( map1[w][k] == 4 ) blit( tiles1, tlo, 480, 0, mapx + k*120, mapy + w*120, 120, 120 );
            else if( map1[w][k] == 5 ) blit( tiles1, tlo, 600, 0, mapx + k*120, mapy + w*120, 120, 120 );
            else if( map1[w][k] == 6 ) blit( tiles1, tlo, 720, 0, mapx + k*120, mapy + w*120, 120, 120 );
       }
}

Offline Dante

  • Użytkownik

  • +4
# Sierpień 01, 2013, 16:37:04
Heh, no oczywiście...za każdym razem wczytuję tileset przy wywołaniu funkcji w pętli...Dzięki za wszystko, już ok ;P