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

Metoda stałokrokowa vs metoda zmiennokrokowa - główna pętla gry

Ostatnio zmodyfikowano 2016-04-26 13:29
Autor Wiadomość
aaadam
Temat założony przez niniejszego użytkownika
» 2016-04-26 13:29:47
jeszcze jedno pytanie bo chcę się upewnić, że na pewno dobrze jest, accumulator += dt/1000; dałem tak żeby przerobić milisekundy na sekundy.
Teraz gdy dam sleepa 1 sekunde to update wykona sie 33 razy a gdy 0.6 to 20. Jak coś jeszcze jest źle to proszę o pomoc.
C/C++
float clamp( float what, float a, float b )
{
    return min( b, max( what, a ) );
}

int main()
{
   
    float dt = 0.0f; //czas od ostatniej aktualizacji
    float lastUpdateTime = GetTickCount(); //czas ostatniej aktualizacji
    //przykladowa funkcja GetCurrentTime() pobiera
    //nam od systemu aktualny czas w sekundach
    float accumulator = 0.0f;
    const float TIME_STEP = 0.03f; //krok czasowy, a zarazem czas trwania ramki
    //fizyki w sekundach; tutaj 30 milisekund, czyli
    //ok. 30 aktualizacji na sekundę
    const float MAX_ACCUMULATED_TIME = 1.0; //maksymalny czas zgromadzony w pojedynczym
   
   
   
   
   
    while( true )
    {
       
        dt = GetTickCount() - lastUpdateTime; //obliczenie czasu od ostatniej klatki
        lastUpdateTime += dt; //podmiana
        dt = max( 0, dt ); //upewniamy sie, ze dt >= 0
        accumulator += dt / 1000;
       
        accumulator = clamp( accumulator, 0.0f, MAX_ACCUMULATED_TIME ); //zapobiegamy
        //zbyt duzej ilosci aktualizacji w danym obiegu
        //petli glownej
        GrabInput(); //<-- zbieranie wejscia z klawiatury, myszki, sieci, itp.
       
        while( accumulator > TIME_STEP )
        {
           
            UpdateGame( TIME_STEP ); //<-- aktualizacja fizyki i logiki gry
            accumulator -= TIME_STEP;
        }
        Sleep( pause );
       
        RenderGame(); //<-- wyswietlenie aktualnego stanu na ekranie
       
    }
}
P-147683
1 « 2 »
Poprzednia strona Strona 2 z 2