Autor Wątek: Allegro 5 niski fps  (Przeczytany 4294 razy)

Offline Nekronomik

  • Użytkownik

# Sierpień 19, 2013, 21:32:17
Witam, jak w temacie mam problem taki że gdy wyświetlam mapę kafelkową 61x61 gdzie kafel ma wymiary 10x10 px to prędkość głównej pętli wynosi około 600k a wyświetlanie grafiki 50 tak jak to ustaliłem (ograniczyłem częstotliwość jej wyświetlania do 50 klatek na sek),lecz gdy zwiększam rozmiar mapy do 62x62 lub więcej to prędkość głównej pętli jak i wyświetlania grafiki wynosi 42. Dodam jeszcze (o ile to ma jakieś znaczenie)że aktywność mojej karty graficznej podczas działania programu wynosi 0%,czasami 13%.

Offline Mr. Spam

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

Offline JasonVoorhees

  • Użytkownik
    • The Immortal Life of the Son of Jay

# Sierpień 19, 2013, 22:16:22
Przy takich wielkościach mapy, możesz sobie spokojnie zrenderować wszystkie kafelki (przed rysowaniem) na jedną powierzchnię, którą będziesz wyświetlał w głównej pętli gry.

Ja się raz złapałem na tym, że uruchamiałem swoją grę w IDE w trybie debug i się dziwowałem, dlaczego żre tyle procka ;) Także to też może wpływać na wydajność.

Offline Nekronomik

  • Użytkownik

# Sierpień 20, 2013, 22:30:43
Owszem wszystkie kafle spokojnie sobie wyświetlę, ale co z tego jeśli moje fps jest małe. Gdzie tu jeszcze dodać inne opcje gry ? jak już w to grac nie będzie można.

Offline Estivo

  • Użytkownik
    • Blog

# Sierpień 20, 2013, 22:33:28
jak wczytujesz kafle? tileset czy każdy z osobna?

Offline Nekronomik

  • Użytkownik

# Sierpień 20, 2013, 23:09:35
Za każdym razem w pętli jest odczytywany ten kod :
al_draw_rotated_bitmap(z1, 10, 10, xp+10 , yp+10, ALLEGRO_PI/180*0, false);

Offline shoter

  • Użytkownik

# Sierpień 20, 2013, 23:39:32
ALLEGRO_PI/180*0Mnożysz przez zero. Bitmapa nie wykona żadnego obrotu. Nie lepiej byłoby użyć al_draw_bitmap?

Offline Nekronomik

  • Użytkownik

# Sierpień 20, 2013, 23:52:52
Wiem że nie wykona obrotu, to zero jest na zaś później tzn. gdybym coś chciał zmienić a ten kod to wycinek z :
int teren_grafika(int okno_x, int okno_y , int x, int y, int z)
{
    int xp,yp;
    xp=parametry_kafla.wielkosc_kafla*x+parametry_wyswietlania.przesun_x;
    yp=parametry_kafla.wielkosc_kafla*y+parametry_wyswietlania.przesun_y;
    if(xp>-parametry_kafla.wielkosc_kafla && xp<okno_x-200 && yp>-parametry_kafla.wielkosc_kafla && yp<okno_y)
    {
        if(kafle[z][y][x].kod==1) al_draw_rotated_bitmap(z1, 10, 10, xp+10 , yp+10, ALLEGRO_PI/180*0, false);
        if(kafle[z][y][x].kod==14) al_draw_rotated_bitmap(z2, 10, 10, xp+10 , yp+10, ALLEGRO_PI/180*180, false);
        if(kafle[z][y][x].kod==4) al_draw_rotated_bitmap(z3, 10, 10, xp+10 , yp+10, ALLEGRO_PI/180*180, false);
        if(kafle[z][y][x].kod==7) al_draw_rotated_bitmap(z5, 10, 10, xp+10 , yp+10, ALLEGRO_PI/180*0, false);
        if(kafle[z][y][x].kod==15) al_draw_rotated_bitmap(z2, 10, 10, xp+10 , yp+10, ALLEGRO_PI/180*270, false);
        if(kafle[z][y][x].kod==5) al_draw_rotated_bitmap(z3, 10, 10, xp+10 , yp+10, ALLEGRO_PI/180*270, false);
        if(kafle[z][y][x].kod==8) al_draw_rotated_bitmap(z5, 10, 10, xp+10 , yp+10, ALLEGRO_PI/180*90, false);
        if(kafle[z][y][x].kod==2) al_draw_rotated_bitmap(z3, 10, 10, xp+10 , yp+10, ALLEGRO_PI/180*0, false);
        if(kafle[z][y][x].kod==9) al_draw_rotated_bitmap(z5, 10, 10, xp+10 , yp+10, ALLEGRO_PI/180*180, false);
        if(kafle[z][y][x].kod==6) al_draw_rotated_bitmap(z5, 10, 10, xp+10 , yp+10, ALLEGRO_PI/180*270, false);
        if(kafle[z][y][x].kod==10) al_draw_rotated_bitmap(z4, 10, 10, xp+10 , yp+10, ALLEGRO_PI/180*0, false);
        if(kafle[z][y][x].kod==11) al_draw_rotated_bitmap(z4, 10, 10, xp+10 , yp+10, ALLEGRO_PI/180*90, false);
        if(kafle[z][y][x].kod==3) al_draw_rotated_bitmap(z3, 10, 10, xp+10 , yp+10, ALLEGRO_PI/180*90, false);
        if(kafle[z][y][x].kod==12) al_draw_rotated_bitmap(z2, 10, 10, xp+10 , yp+10, ALLEGRO_PI/180*0, false);
        if(kafle[z][y][x].kod==13) al_draw_rotated_bitmap(z2, 10, 10, xp+10 , yp+10, ALLEGRO_PI/180*90, false);
        if(kafle[z][y][x].kod==16) al_draw_rotated_bitmap(z6, 10, 10, xp+10 , yp+10, ALLEGRO_PI/180*0, false);
    }
}
ta funkcja właśnie decyduje o tym jaki kafel ma być wyświetlony.
« Ostatnia zmiana: Sierpień 20, 2013, 23:55:44 wysłana przez Nekronomik »

Offline JasonVoorhees

  • Użytkownik
    • The Immortal Life of the Son of Jay

# Sierpień 20, 2013, 23:57:09
policz sobie ile ifów się wykona dla wszystkich kafli :)

Nie prościej byłoby w tablicy kafle np. wsadzić referencje na odpowiednie typy kafelków już narysowane? Ominąłbyś wtedy drabinkę ifów
« Ostatnia zmiana: Sierpień 21, 2013, 00:00:05 wysłana przez JasonVoorhees »

Offline Nekronomik

  • Użytkownik

# Sierpień 21, 2013, 00:04:42
if'y wykonują się bardzo szybko,testy robiłem też bezpośrednio na samym wyświetlaniu grafiki;
int pokaz()
{
    for(int y=0;y<100;y++)
    {
        for(int x=0;x<100;x++)
        {
            xp=parametry_kafla.wielkosc_kafla*x+parametry_wyswietlania.przesun_x;
            yp=parametry_kafla.wielkosc_kafla*y+parametry_wyswietlania.przesun_y;
            al_draw_rotated_bitmap(z1, 10, 10, xp+10 , yp+10, ALLEGRO_PI/180*0, false);
        }
    }
}
i miałem ten sam problem.

Offline Amun

  • Użytkownik

# Sierpień 21, 2013, 00:05:15
policz sobie ile ifów się wykona dla wszystkich kafli :)

62x62 i chyba 17 if'ów na kafel - wykonanie około 65k ifów dla narysowania mapy :D

Offline JasonVoorhees

  • Użytkownik
    • The Immortal Life of the Son of Jay

# Sierpień 21, 2013, 00:06:14
Ograniczenie ilości wyświetlanych kafli też mógłbyś zrobić inteligentniej. Napisałbyś jakiś selektor, który by rysował wszystkie kafle z zadanego przedziału. Na dobrą sprawę wystarczą Ci tylko współrzędne początkowe lewy górny róg ekranu, potem rysujesz tyle ile się zmieści lub do końca tablicy (żeby nie wyjść poza zakres).

Offline Nekronomik

  • Użytkownik

# Sierpień 21, 2013, 00:21:00
Cytuj
Ograniczenie ilości wyświetlanych kafli też mógłbyś zrobić inteligentniej
W jakim sensie inteligentniej ? Wyświetlane są tylko te na ekranie, poza już nie.
A z tymi  if'ami faktycznie coś muszę zrobić.
Cytuj
Na dobrą sprawę wystarczą Ci tylko współrzędne początkowe lewy górny róg ekranu, potem rysujesz tyle ile się zmieści lub do końca tablic
nie rozumiem(naprawdę nie rozumiem).

Offline Xirdus

  • Redaktor

# Sierpień 21, 2013, 00:45:53
A z tymi  if'ami faktycznie coś muszę zrobić.
Twój kod znaczy mniej więcej "zależnie od numerka daj inne parametry do funkcji". Ify można zastąpić tablicą (bądź tablicą asocjacyjną zwaną również mapą - std::map), w której indeksem jest kod kafelka, a danymi struktura trzymająca dane do przekazania funkcji.
struct DaneKafelka
{
    ALLEGRO_BITMAP* bitmapa;
    int obrot;
}

DaneKafelka daneWszystkichKafelkow[iloscWszystkichKafelkow]; // albo std::map<int,DaneKafelka>

al_draw_rotated_bitmap(kafle[z][y][x].bitmapa, 10, 10, xp+10 , yp+10, ALLEGRO_PI/180 * kafle[z][y][x].obrot, false);

nie rozumiem(naprawdę nie rozumiem).
Odpowiedź masz w pierwszej linijce swojego własnego posta.

Offline Estivo

  • Użytkownik
    • Blog

# Sierpień 21, 2013, 13:30:30
Jeżeli uparłeś się na ify, to chociaż trzeba było podopisywać else. I jaki jest ten szybki czas wykonania ifów?

Offline Nekronomik

  • Użytkownik

# Sierpień 21, 2013, 14:08:57
Z if'ami miałem 300k .Zrobiłem tak jak mi doradzono i pozbyłem się if'ów i wygląda to chwilowo teraz tak:
int pokaz()
{
    int xp,yp;
    for(int y=0;y<500;y++)
    {
        for(int x=0;x<500;x++)
        {
            xp=parametry_kafla.wielkosc_kafla*x+parametry_wyswietlania.przesun_x;
            yp=parametry_kafla.wielkosc_kafla*y+parametry_wyswietlania.przesun_y;
            //teren_grafika(okno_x, okno_y , x, y, parametry_wyswietlania.poziom_z);
            if(xp>-parametry_kafla.wielkosc_kafla && xp<okno_x-200 && yp>-parametry_kafla.wielkosc_kafla && yp<okno_y && kafle[parametry_wyswietlania.poziom_z][y][x].zajenty==1)
            {
                al_draw_rotated_bitmap(z[kafle[parametry_wyswietlania.poziom_z][y][x].nr_bitmapy], 10, 10, xp+10 , yp+10, ALLEGRO_PI/180*kafle[parametry_wyswietlania.poziom_z][y][x].obrot, false);
            }
        }
    }
}
i fps wynosi teraz około 440k
Nie to że się uparłem na if'y, po prostu miałem wtedy taki pomysł.