FPS - FramesPerSeconds



  • Hallo,

    ich wollte gerne wissen wie ich, am bessten mit den Standard Bibliotheken, die FramesPerSeconds in meinem Programm schreiben kann.

    (Da ich ein Spiel programmiere passt das zwar eigentlich nicht sogut hier rein, aber es geht mir schließlich nicht um Grafik oder der Gleichen sondern um etwas, was man in C++ allgemein können sollte - 'hoff ich jeden Falls ^^')

    Falls dies nicht über die Standard Bibliotheken laufen sollte vielleicht über Win32 oder Linux?! (möchte das Programm für beide Systeme lauffähig machen)

    Danke! 🙂



  • Wieso sollte das allgemein sein? Niemand braucht fps, außer Shooterprogrammierern 😉

    Du kannst das mit clock bewerkstelligen:

    #include <ctime>
    
    int main ()
    {
       std::clock_t letztes_mal;
    
       double fps = 0.;
    
       for (;;)
       {
           // blubb, dein Code für Grafik und sonstigen "pro-frame" Kram
           fps = CLOCKS_PER_SEC / static_cast<double> (std::clock () - letztes_mal);
           letztes_mal = std::clock ();
       }
    }
    


    1. falsches forum, registrieren und @spiele entwicklung forum schreiben.

    2. das ist jetzt nur pseudocode aber so in etwa geht das (sehr vereinfachte form)

    was man dafür braucht ist ein timer (mit genug auflösung)
    platform unabhängig gibts sowas zb mit SDL

    void GameLoop()
    {
    static float numSamples = 0;
    static float FPS = 0.0f; 
    
    ...
    
    int before = getTime();
    DrawFrame();
    int after = getTime();
    
    //getTime sollte millisec zurückgeben daher 1000 durch
    float renderTime = 1000 / static_cast<float>(after - before); //one sample
    
    ++numSamples;
    FPS = (FPS + renderTime) / numSamples;
    
    ...
    }
    


  • "Okay, du hast Recht das war blöd eingeordnet :p "

    Und der Code ist auch wirklich sicher, also ich meine nicht dass das Programm dann sau langsam wird oder das es mal schneller und mal deutlich langsamer läuft??



  • Achso, Momentmal, die beiden Codes fragen erst mal nur die FPS ab

    Wie aber kann ich sie selbst einstellen damit mein Programm nicht zu schnell wird?



  • Indem du am Ende der Anzeigeschleife so lange wartest, bis die erforderliche Framezeit abgelaufen ist:

    int frametime=timescale/*Auflösung deiner Timer-Funktion*/ / fps;
    for(;;)
    {
      int loopstart=getTime();
      ...
      while(getTime()<loopstart+frametime);//warte bis Frame-Ende
    }
    

    Je nach System kannst du auch per SetTimer() einen Timer loslaufen lassen, der alle 1000/fps Millisekunden aktiv wird - und bei jeder Timer-Aktivierung dann einen neuen Frame zeichnen.



  • da gibts verschiedene modelle,
    was ich raten würde wäre die entkopplung von game logic ticks (UPS) und rendering ticks (FPS).

    und auch dafür gibt es verschiedene arten es zu implementieren.

    so in etwa könnte es aussehen.

    void GameUpdate(double time /*seit dem letzten frame*/)
    {
     // objekte anhand des zeitfensters in der welt modifizieren
    
     IDuckSoldier* pDuck = GetDuckSoldier();
     pDuck->translate(pDuck->getXTrans() * time, pDuck->getYTrans() * time);
    
     ...
    }
    
    void DrawFrame()
    {
     // objekte zeichnen
     IScreen* pScreen = GetScreen();
    
     IDuckSoldier* pDuck = GetDuckSoldier();
     pDuck->draw(pScreen);
    }
    
    void GameLoop()
    {
     static unsigned int desUPS = 25; // so oft soll das spielgeschehen upgedated werden
    
     int lastUpdate = getTime();
     while(gameRunning) 
     {
      //input handling
      ...
      //network handling
      ...
    
      //game update
      int curTime = getTime() - lastUpdate;
    
      if (curTime > 1000 / 25) //nur 25mal pro sekunde updaten
      {
       GameUpdate(static_cast<float>(curTime));
       lastUpdate = getTime();
      }
    
      //rendering
      DrawFrame();  //so oft wie möglich zeichnen
    
      //statistics
      ...
    
      sleep(1); // bisserl schlafen damit andere threads auch zum zug kommen
     }
    }
    


  • man kann doch auch eine fps Funktion anlegen

    int main(void){
        //...
        int fps;
        //...
        while(true){
            fps = getFPS();
            //...
            drawScene();
            //...
        }
        return 0;
    }
    
    int getFPS(){
        static double alt = 1,neu = 1;
        alt = neu;
        neu = getTime(); //(in Sekunden)
        return (int)(1./(neu - alt))
    }
    

    aber mache es, wie du meinst, dass es am wenigsten übersicht zerstört.



  • Alles klar. Ich hab jetzt verstanden wie es funktioniert.

    Danke an alle 😃


Anmelden zum Antworten