Allegro 5 problem z fps
Ostatnio zmodyfikowano 2013-08-21 15:33
Nekronomik Temat założony przez niniejszego użytkownika |
Allegro 5 problem z fps » 2013-02-25 20:46:47 Witam,mam taki problem gdy wyświetlam mapę kafelkową 10x10 to fps wynosi około 2000.Lecz gdy mapę zwiększam na 20x20 fps spada do 600 a gdy tworze mapę na cały ekran to mam fps kolo 60.Czy jest jakiś sposób na zwiększenie fps ? Bo jak dojdą do mapy jeszcze jakieś obiekty typu drzewa,domki i moby to w to się grać nie będzie dało. |
|
Wasilek |
» 2013-02-25 21:23:56 Nie znam bezpośredniej przyczyny, lecz zdaje mi się, że robisz przy każdym obrocie pętli jakieś "ciężkie" zadanie w sensie, że np wczytujesz obrazek z pliku co jest niepotrzebne(piszę w SFML, ale takie rzeczy pewnie i tutaj są ;) ). Ewentualnie pokaż kod programu :)
Ja powiem tylko, że w przypadku SFML i okna 600*600 to standardem było około 800 FPSów gdy tylko wyświetlałem obrazki i sprawdzałem zdarzenia. |
|
Nekronomik Temat założony przez niniejszego użytkownika |
» 2013-02-25 21:31:17 #include <allegro5/allegro.h> #include <allegro5/allegro_image.h> #include <allegro5/allegro_direct3d.h> #include<iostream> #include"teren.h" #include"generator_terenu.h" using namespace std; ALLEGRO_BITMAP * trawa = NULL; ALLEGRO_BITMAP * ziemia = NULL; ALLEGRO_BITMAP * zaznaczenie = NULL; ALLEGRO_KEYBOARD_STATE Key; ALLEGRO_MOUSE_STATE Mouse; double czas = 0; int inicjalizacja_allegro() { al_init(); al_set_new_display_flags( ALLEGRO_WINDOWED | ALLEGRO_DIRECT3D ); al_create_display( 1000, 600 ); al_init_image_addon(); al_install_keyboard(); al_install_mouse(); srand( time( NULL ) ); } int grafika() { trawa = al_load_bitmap( "trawa.png" ); ziemia = al_load_bitmap( "ziemia.png" ); zaznaczenie = al_load_bitmap( "zaznaczenie.png" ); } int maskowanie() { al_convert_mask_to_alpha( trawa, al_map_rgb( 255, 255, 255 ) ); al_convert_mask_to_alpha( ziemia, al_map_rgb( 255, 255, 255 ) ); al_convert_mask_to_alpha( zaznaczenie, al_map_rgb( 255, 255, 255 ) ); } int niszczenie_grafiki() { al_destroy_bitmap( trawa ); al_destroy_bitmap( ziemia ); al_destroy_bitmap( zaznaczenie ); } int wyswietlanie() { int ys = 0, xs = 0; static int pozycja_mapy_y = 0; static int pozycja_mapy_x = 0; al_get_keyboard_state( & Key ); al_get_mouse_state( & Mouse ); if( al_get_time() > czas + 0.01 ) { czas = al_get_time(); if( al_key_down( & Key, ALLEGRO_KEY_A ) ) pozycja_mapy_x -= 1; if( al_key_down( & Key, ALLEGRO_KEY_D ) ) pozycja_mapy_x += 1; if( al_key_down( & Key, ALLEGRO_KEY_W ) ) pozycja_mapy_y -= 1; if( al_key_down( & Key, ALLEGRO_KEY_S ) ) pozycja_mapy_y += 1; } for( int y = 0; y < 20; y++ ) { for( int x = 0; x < 20; x++ ) { xs =( x - y ) * 48 / 2 + pozycja_mapy_x + 500; ys =( y + x ) * 24 / 2 + pozycja_mapy_y + 0; if( kafel[ y ][ x ].kod == 100 ) { al_draw_bitmap( trawa, xs, ys, false ); } if( kafel[ y ][ x ].kod == 101 ) { al_draw_bitmap( ziemia, xs, ys, false ); } if( Mouse.x > xs && Mouse.x < xs + 48 && Mouse.y > ys && Mouse.y < ys + 23 ) { al_draw_bitmap( zaznaczenie, xs, ys, false ); } } } } int main() { inicjalizacja_allegro(); grafika(); maskowanie(); generator(); int a = 1; int fps = 0; for(;; ) { al_get_keyboard_state( & Key ); wyswietlanie(); fps++; if( al_get_time() > a ) { cout << fps << endl; fps = 0; a++; } if( al_key_down( & Key, ALLEGRO_KEY_ESCAPE ) ) break; al_flip_display(); al_clear_to_color( al_map_rgb( 0, 0, 0 ) ); } niszczenie_grafiki(); return 0; }
|
|
DejaVu |
» 2013-02-25 21:35:33 Nie martw się na zapas. |
|
Nekronomik Temat założony przez niniejszego użytkownika |
» 2013-02-26 23:18:35 Czy ten zapis bitmapy który przedstawiłem w kodzie i jest na kursach,wczytuje obrazek z pliku za każdym razem ? Szukam informacji na ten temat ale coś znależć nie mogę. |
|
ison |
» 2013-02-27 00:17:45 Nie. Bitmapy wczytujesz tylko w funkcji 'grafika', a ją wywołujesz raz. |
|
Nekronomik Temat założony przez niniejszego użytkownika |
» 2013-08-16 16:40:49 Poprawiłem wyświetlanie grafiki w sensie takim ze grafika była wyświetlana na żywca,ograniczyłem ja to 50 kl/s. Ale problem jest dalej 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,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.Może jest jeszcze inny sposób wyświetlania grafiki bo np. jak taka gra jak "terraria" sobie z tym radzi. |
|
DejaVu |
» 2013-08-20 14:50:40 1. Wyświetlaj tylko to co może być potencjalnie widoczne na ekranie.
2. Wczytaj tekstury przed pętlą główną.
3. Kompiluj w trybie Release jeżeli chcesz sprawdzić rzeczywistą wydajność kodu - tryb Debug zawsze będzie wolny.
4. Pusty ekran ma 6tys. klatek bo karta graficzna nie musi wykonywać żadnych operacji - przetwarzanie sceny jest kosztowne i koniec końców w trybie release powinieneś uzyskiwać zbliżone wartości FPS do innych gier opartych o bibiliotekę OpenGL. |
|
« 1 » 2 |