Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[Allegro] wydajnosc podwojnego buforowania

Ostatnio zmodyfikowano 2009-12-08 12:38
Autor Wiadomość
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:
C/C++
fpsCounter++; //licznik fps
clear_bitmap( buffor ); //czyscimy bufor
blit( buffor, screen, 0, 0, 0, 0, SCREEN_W, SCREEN_H ); //kopiujemy bufor na ekran
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:
C/C++
fpsCounter++; //licznik fps
clear_bitmap( buffor ); //czyscimy bufor
to wtedy mam ok 180-190 fps.

Moze mi ktos wyjasnic czym moze byc spowodowana tak mala wydajnosc gry?
Z gory dziekuje za odpowiedz.
P-11973
lynx
» 2009-12-06 23:30:28
Może zastosowałeś też timer to 'rysowania'? ;p
P-11976
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).
P-11977
cypel
Temat założony przez niniejszego użytkownika
» 2009-12-07 22:16:50
No dobra, wiec tak:

C/C++
#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.
P-11993
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/
P-11994
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.
P-11998
« 1 »
  Strona 1 z 1