piątek, 17 września 2010

Klasa Timer - ograniczenie FPS

W obecnym stanie szybkość gry zależy od mocy sprzętu. Jeśli będzie za szybko, nie będzie dało się grać! Aby ograniczyć ilość klatek na sekundę wspomożemy się klasą Timer.

class Timer
{
    private:
    //The clock time when the timer started
    int startTicks;

    //The ticks stored when the timer was paused
    int pausedTicks;

    //The timer status
    bool paused;
    bool started;

    public:
    //Initializes variables
    Timer();

    //The various clock actions
    void start();
    void stop();
    void pause();
    void unpause();

    //Gets the timer's time
    int get_ticks();

    //Checks the status of the timer
    bool is_started();
    bool is_paused();
};

Funkcja start sprawdza, czy timer przypadkiem nie został już uruchomiony. Jeśli nie, ustawiamy started na "true", a startTicks na wartość SDL_GetTicks() (zwraca ona ilość milisekund od zainicjowania biblioteki SDL).

Funkcja stop ustawia started i paused na "false".

Funkcja pause sprawdza, czy timer jest uruchomiony i czy nie jest już zpauzowany. Jeśli nie, zapisujemy do pausedTicks obecną ilość milisekund. Dzięki temu w funkcji unpause przestawimy startTicks na ilość milisekund, przez które Timer był zpauzowany, dając poprawny wynik w get_ticks.

Mała zmiana w main.cpp i gotowe!
Timer *fps = new Timer;

for (int frame = 0; ; frame++)
{
        fps->start();

 if (Listener->HandleEvents(&event) == -1)
  break;

 Window->DoLogic();
 Window->DrawScreen();

 Screen->Flip();

        if(fps->get_ticks() < 1000 / FRAMES_PER_SECOND)
        {
            //Sleep the remaining frame time
            SDL_Delay((1000/FRAMES_PER_SECOND) - fps->get_ticks());
        }
}

Sprawdzamy czy wygenerowanie jednej klatki zajęło MNIEJ niż 60 milisekund. Jeśli tak, musimy chwilę poczekać.

1 komentarz:

  1. Mała rada: nie ograniczaj FPS-ów tylko oprzyj obliczanie fizyki o czas(+ ewentualnie ustaw stały krok czasowy dla nich, by nie liczyć jej "za dużo" razy na sekundę).
    http://temporal.pr0.pl/devblog/download/arts/fixed_step/fixed_step.pdf

    OdpowiedzUsuń