cypel Temat założony przez niniejszego użytkownika |
[Allegro] wydajnosc podwojnego buforowania » 2009-12-06 22:50:40 Witam! Mam takie pytanie/problem. Otoz po kolei: Mam sobie gre, wykorzystuje w niej biblioteke allegro i podwojne buforowanie. W kazdym wywolaniu glowniej petli mam kod: fpsCounter++; clear_bitmap( buffor ); blit( buffor, screen, 0, 0, 0, 0, SCREEN_W, SCREEN_H );
przy takim kodzie gra ma ok 45 fps (dodam ze nie wywoluje tutaj wogole funkcji rysujacych, jedynie czyszczenie bufora i jego wyswietlanie). To bardzo malo, zdecydowanie za malo. Zauwazylem cos takiego: Z biblioteka allegro dolaczona jest taka prosta gra, latasz statkiem kosmicznym i rozwalasz asteroidy. Sa tez do niej dolaczone zrodla. Podwojne buforowanie w tej grze odbywa sie identycznie jak u mnie. Mimo to gra ta ma ok 180 fps. Gdy u siebie usune linijke kopiujaca bufor na ekran, tak ze zostanie tylko: fpsCounter++; clear_bitmap( buffor );
to wtedy mam ok 180-190 fps. Moze mi ktos wyjasnic czym moze byc spowodowana tak mala wydajnosc gry? Z gory dziekuje za odpowiedz. |
|
lynx |
» 2009-12-06 23:30:28 Może zastosowałeś też timer to 'rysowania'? ;p |
|
DejaVu |
» 2009-12-06 23:40:44 Zapodaj prostym kodem, który możemy przetestować (czytaj: pokaż nam kod, w którym zachodzi opisany problem). |
|
cypel Temat założony przez niniejszego użytkownika |
» 2009-12-07 22:16:50 No dobra, wiec tak: #include <allegro.h>
volatile int fps = 0; volatile int fpsCounter = 0;
void FramesPerSecond() { fps = fpsCounter; fpsCounter = 0; } END_OF_FUNCTION( FramesPerSecond )
LOCK_VARIABLE( fps ); LOCK_FUNCTION( FramesPerSecond );
void InitGraphic(); void DeinitGraphic();
int main() { InitGraphic(); BITMAP * bufor; bufor = create_bitmap( 1024, 768 ); while( !key[ KEY_ESC ] ) { fpsCounter++; clear_bitmap( bufor ); textprintf_ex( bufor, font, 10, 10, - 1, 255, "fps: %i", fps ); blit( bufor, screen, 0, 0, 0, 0, SCREEN_W, SCREEN_H ); } destroy_bitmap( bufor ); DeinitGraphic(); return 0; } END_OF_MAIN()
void InitGraphic() { int depth, res; allegro_init(); depth = desktop_color_depth(); if( depth == 0 ) depth = 32; set_color_depth( depth ); res = set_gfx_mode( GFX_AUTODETECT_FULLSCREEN, 1024, 768, 0, 0 ); if( res != 0 ) { allegro_message( allegro_error ); exit( - 1 ); } install_timer(); install_keyboard(); install_mouse(); install_int_ex( FramesPerSecond, BPS_TO_TIMER( 1 ) ); }
void DeinitGraphic() { clear_keybuf(); }
Mam taki program, wyswietla mi on okolo 45 fps (semptron 2500+) Czy to normalne? Moze i nie mam demona szybosci (semptron 2500+, GeForce 5200),ale czy ten program nie powinien dzialac szybciej?? Pozdrawiam. |
|
DejaVu |
» 2009-12-07 23:15:29 No więc tak: 1) Gdy pętla jest pusta: fps: 330002393 fps: 670215121 fps: 1010106358 fps: 1350784741 fps: 341607019 fps: 682407589 fps: 340279184 fps: 340046287 fps: 336671599 fps: 665374430 fps: 335766807 2) Gdy pętla posiada tylko czyszczenie bitmapy: fps: 1061 fps: 1000 fps: 1059 fps: 1041 fps: 1034 fps: 1043 fps: 1067 fps: 1068 fps: 1068 fps: 1042 3) Gdy pętla posiada czyszczenie bitmapy i wyświetlanie bitmapy: fps: 330 fps: 338 fps: 337 fps: 338 fps: 336 fps: 338 fps: 337 fps: 337 fps: 338 fps: 337 4) Gdy pętla jest taka, jaką przedstawiłeś: fps: 331 fps: 335 fps: 335 fps: 336 fps: 335 fps: 335 fps: 336 fps: 322 5) Gdy zmienimy ilość bitów z 32 na 16: fps: 541 fps: 729 fps: 741 fps: 739 fps: 740 fps: 735 fps: 740 fps: 740 fps: 739 fps: 739 fps: 737 fps: 741 Innymi słowy: biblioteka allegro nie jest jakaś mega wydajna, jednak jest zadowalająca bo jest prosta. Ja testowałem na allegro 4.x. Istnieje również wersja allegro 5.x i dodatkowo wykorzystująca bibliotekę OpenGL'a, która z pewnością jest dużo wydajniejsza. Dlatego więc jeśli chcesz uzyskać większą wydajność proponuję spróbować poszukać tej wersji biblioteki, która wykorzystuje OpenGL'a. Inną opcją jest zmniejszenie rozdzielczości. Przykładowo 800x600x16 daje wyniki: fps: 793 fps: 1032 fps: 1071 fps: 1069 fps: 1070 fps: 1071 fps: 1064 fps: 1068 fps: 1069 /edit: Jeśli się nie mylę to Allegro nie używa możliwości sprzętowch karty graficznej. Aby takowe wydobyć z niego należy posłużyć się biblioteką, która wykorzystuje OpenGL'a lub DirectX'a. /edit2: AllegroGL AllegroGL is now part of the Allegro 4.3.x development series (Allegro 4.4 stable). We suggest using that version if you want to use OpenGL with Allegro 4. If for some reason you are still using Allegro 4.2.x and don't want to upgrade, you can still get the latest standalone AllegroGL from the SourceForge download page.
The Allegro 5 development series also comes with full OpenGL support.
Źródło: http://allegrogl.sourceforge.net/ |
|
|
cypel Temat założony przez niniejszego użytkownika |
» 2009-12-08 12:38:39 Dobra, wielkie dzieki, juz rozumiem. Zmniejsze ilosc bitow na kolorze i jeszcze sprawdze ta allegro 5.x. Jeszcze raz dzieki za zainteresowanie. Pozdrawiam. |
|
« 1 » |