Warsztat.GD

Programowanie => Programowanie grafiki => Allegro => Wątek zaczęty przez: Nekronomik w Sierpień 19, 2013, 21:32:17

Tytuł: Allegro 5 niski fps
Wiadomość wysłana przez: Nekronomik w 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%.
Tytuł: Odp: Allegro 5 niski fps
Wiadomość wysłana przez: JasonVoorhees w 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ść.
Tytuł: Odp: Allegro 5 niski fps
Wiadomość wysłana przez: Nekronomik w 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.
Tytuł: Odp: Allegro 5 niski fps
Wiadomość wysłana przez: Estivo w Sierpień 20, 2013, 22:33:28
jak wczytujesz kafle? tileset czy każdy z osobna?
Tytuł: Odp: Allegro 5 niski fps
Wiadomość wysłana przez: Nekronomik w 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);
Tytuł: Odp: Allegro 5 niski fps
Wiadomość wysłana przez: shoter w 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?
Tytuł: Odp: Allegro 5 niski fps
Wiadomość wysłana przez: Nekronomik w 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.
Tytuł: Odp: Allegro 5 niski fps
Wiadomość wysłana przez: JasonVoorhees w 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
Tytuł: Odp: Allegro 5 niski fps
Wiadomość wysłana przez: Nekronomik w 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.
Tytuł: Odp: Allegro 5 niski fps
Wiadomość wysłana przez: Amun w 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
Tytuł: Odp: Allegro 5 niski fps
Wiadomość wysłana przez: JasonVoorhees w 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).
Tytuł: Odp: Allegro 5 niski fps
Wiadomość wysłana przez: Nekronomik w 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).
Tytuł: Odp: Allegro 5 niski fps
Wiadomość wysłana przez: Xirdus w 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.
Tytuł: Odp: Allegro 5 niski fps
Wiadomość wysłana przez: Estivo w 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?
Tytuł: Odp: Allegro 5 niski fps
Wiadomość wysłana przez: Nekronomik w 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ł.
Tytuł: Odp: Allegro 5 niski fps
Wiadomość wysłana przez: Amun w Sierpień 21, 2013, 14:24:52
i fps wynosi teraz około 440k

Musisz mieć ładną maszynę...
Tytuł: Odp: Allegro 5 niski fps
Wiadomość wysłana przez: JasonVoorhees w Sierpień 21, 2013, 14:45:01
Albo źle liczy FPS :D
Tytuł: Odp: Allegro 5 niski fps
Wiadomość wysłana przez: Estivo w Sierpień 21, 2013, 14:47:44
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:
i fps wynosi teraz około 440k
Nie to że się uparłem na if'y, po prostu miałem wtedy taki pomysł.

coś czuje, że ty fps masz źle liczony. Podaj nam delte czasu renderowania kolejnych klatek(chociaż jednej, albo średnią), bo z fpsami to my się nie dogadamy.
Tytuł: Odp: Allegro 5 niski fps
Wiadomość wysłana przez: Xirdus w Sierpień 21, 2013, 15:03:49
Wydaje mi się, że to k oznacza klatki, nie tysiące ;)
Tytuł: Odp: Allegro 5 niski fps
Wiadomość wysłana przez: Nekronomik w Sierpień 21, 2013, 15:05:13
tu jest główna pętla:
int main()
{
    allegro_inicjalizacja();
    bitmapy();
    generator();
    for(;;)
    {
        al_get_keyboard_state(&Key);
        al_get_mouse_state( & Mouse );
        czas_grafika();
        czas_obliczenia();
        if(al_get_time()>czas_2+1) //  <--------tym if'em obliczam fps głównej pętli
        {
            czas_2=al_get_time();
            cout<<fps_p<<" "<<fps_g<<" "<<endl;
            fps_p=0;
            fps_g=0;
        }
        fps_p++;
        if(obliczenia)
        {
            mapa();
            mysz_krawedzie(okno_x, okno_y, Mouse.x ,Mouse.y);
        }
        if(grafika)
        {
            pokaz();
            panel(okno_x, okno_y, Mouse.x ,Mouse.y, Mouse.buttons);
        }
        if(grafika)
        {
            al_flip_display();
            al_clear_to_color(al_map_rgb(0,0,0));
            grafika=false;
            fps_g++;
        }
        if(Mouse.buttons==0)klik=false;
        if(al_key_down(&Key,ALLEGRO_KEY_ESCAPE))break;
       niszczenie();
       return 0;
}
if(grafika) mam 2x ponieważ jedno z nich będzie przeniesione do switch().
Fps podawałem w tysiącach i powinna być dobrze liczona.
zmienna fps_p liczy ilość pętli a
        if(al_get_time()>czas_2+1)
        {
            czas_2=al_get_time();
            cout<<fps_p<<" "<<fps_g<<" "<<endl;
            fps_p=0;
            fps_g=0;
        }
po 1 sekundzie wyświetla mi ta zmienną i ją zeruje itd.