FPS Klasse



  • Ich hab eine Klasse mit C++ (???) programmiert, nur leider klappt's nicht ganz, wie ich mir das vorstelle. Die maximale Framerate ist manchmal (kommt drauf an in welchen Projekten ich sie einbaue; es klappt auch manchmal) 66 fps, nur ich weiß net warum.

    #include <eigene\stoppuhr.h>                                                     /* Stoppuhr */
    #ifndef EIGENEFPSH
    #define EIGENEFPSH
    chronometer cm;                                                                  /* Millisekunden genaue Stoppuhr wird gestartet */
    void Schlafe(int was)
    {
     HANDLE warte = CreateEvent(NULL, FALSE, FALSE, NULL);
     WaitForSingleObject(warte, was);
    }
    class fps                                                                        /* Erstellten der fps Klasse */
    {
    public:
     fps(unsigned char was_fps)                                                      /* Die Erstell-Funktion */
     {
      cm.start();                                                                    /* Die Uhr wird gestartet */
      zeit = cm.elapsed_milliseconds();                                              /* Der erste Tick wird berechnet */
      setfps(was_fps);                                                               /* Stellt die übergebene Framrate ein */
     };                                                                              /* Semikolon nicht vergessen! */
     int wartezeit;                                                                  /* Die Wartezeit zwischen 2 Frames */
     int fps_temp;                                                                   /* Zeit zwischen zwei Ticks */
     private:                                                                        /* Die Variablen und Funktionen müssen nicht unbedingt global sein */
     unsigned int zeit;                                                              /* Der letzte Tick */
     unsigned char ifps;                                                             /* In dieser Variable wird die Framerate gespeichert */
     public:
     void warten ()                                                                  /* Funktion die wartet damit die Framerate nicht überschritten wird */
     {
      fps_temp = wartezeit-(cm.elapsed_milliseconds()-zeit);                         /* Berechnet die Zeit zwischen 2 Frames */
      if (fps_temp > 0)                                                              /* Wir wollen ja nicht das Sleep einen negativen Wert bekommt oder? Außerdem würde Sleep(0) keinen Sinn machen. */
      {
       Schlafe(fps_temp);                                                            /* Jetzt wird geschlafen... */
      }
      zeit = cm.elapsed_milliseconds();                                              /* Ein neuer Tick wird erstellt. */
     }
     unsigned char getfps() {return ifps;}                                           /* Gibt die aktuelle Framrate wieder */
     void setfps(unsigned char was_fps)                                              /* Aktualisiert die Framerate */
     {
      ifps = was_fps;                                                                /* Speichert die Framerate */
      wartezeit = int(1000/was_fps);                                                 /* Die Wartezeit wird berechnet */
     }
    };
    #endif
    


  • Im XGamesSDK gibts auch eine.

    Bye, TGGC (Keine Macht den Dummen)



  • C++ (???)

    Najo schönes C++ ist es nicht. Schnittstelle und Definition gehören getrennt, public Variablen, Namen sind auch nicht gerade schön 😉 Naja warten ist nicht gerade gut



  • TGGC schrieb:

    Im XGamesSDK gibts auch eine.

    In meinem Spiel habe ich auch eine. 😃

    @joomoo kann es am Monitor liegen?



  • joomoo schrieb:

    ... Die maximale Framerate ist manchmal (kommt drauf an in welchen Projekten ich sie einbaue; es klappt auch manchmal) 66 fps, nur ich weiß net warum...

    VSYNC 💡



  • Cpp_Junky schrieb:

    joomoo schrieb:

    ... Die maximale Framerate ist manchmal (kommt drauf an in welchen Projekten ich sie einbaue; es klappt auch manchmal) 66 fps, nur ich weiß net warum...

    VSYNC 💡

    Als ich VSYNC deaktiviert habe, trat das Problem leider immer noch auf 😞



  • Die maximale Framerate ist manchmal (kommt drauf an in welchen Projekten ich sie einbaue; es klappt auch manchmal) 66 fps, nur ich weiß net warum...

    Was willst du uns damit sagen? Frameraten ändern sich und wenn es nicht größer 66 fps wird hängt es villeicht daran dass einfach zuviel Arbeit da ist...



  • dali schrieb:

    Die maximale Framerate ist manchmal (kommt drauf an in welchen Projekten ich sie einbaue; es klappt auch manchmal) 66 fps, nur ich weiß net warum...

    Was willst du uns damit sagen? Frameraten ändern sich und wenn es nicht größer 66 fps wird hängt es villeicht daran dass einfach zuviel Arbeit da ist...

    nein, wenn ich die wartezeit überprüfe, stelle ich immer fest, dass diese bei 10ms liegt (ich hab 100 fps eingestellt). Die CPU Auslastung liegt auch bei nur 3 %...



  • joomoo schrieb:

    nein, wenn ich die wartezeit überprüfe, stelle ich immer fest, dass diese bei 10ms liegt (ich hab 100 fps eingestellt). Die CPU Auslastung liegt auch bei nur 3 %...

    Wenn du immer 10ms bei jedem Frame wartest wirst du nur schwer auf 100 fps kommen ausser du machst villeicht in der Schleife absolut gar nichts...



  • Nein ich hab die Lösung nicht, aber ein-zwei punkte die ich anzumerken habe:

    CreateEvent liefert dir ein Handle zurück. Wo gibst du dieses frei?
    Was soll die Übung mit WaitForSingleObject? Wieso nicht direkt "Sleep"?


  • Mod

    junix schrieb:

    Was soll die Übung mit WaitForSingleObject? Wieso nicht direkt "Sleep"?

    da macht es mal einer richtig, und wird gleich zurecht gewiesen *hehe*... es gibt einige intel paper in denen steht, dass man WaitForSingleObject statt Sleep benutzen soll, hat was mit multithreading auf mehr als einer cpu/einem core (HT) zu tun 😉

    rapso->greets();



  • dali schrieb:

    joomoo schrieb:

    nein, wenn ich die wartezeit überprüfe, stelle ich immer fest, dass diese bei 10ms liegt (ich hab 100 fps eingestellt). Die CPU Auslastung liegt auch bei nur 3 %...

    Wenn du immer 10ms bei jedem Frame wartest wirst du nur schwer auf 100 fps kommen ausser du machst villeicht in der Schleife absolut gar nichts...

    Ja stimmt. Bestimmt mach in meiner Schleife gar nichts. Genau. Ich mach maln Programm was gar nichts macht. Soll heißen: Natürlich mach ich was in der Schleife, ich spiele ja dann mein spiel, aber halt nur mit 66 fps.

    Wieso komm ich mit 10ms nicht auf 100fps???

    10 ms * 100 = 1000 ms = 1 s



  • weil dein malprogramm vielleicht auch 5ms pro schleifendurchlauf verschlinkt? (und nicht 0ms)



  • life schrieb:

    weil dein malprogramm vielleicht auch 5ms pro schleifendurchlauf verschlinkt? (und nicht 0ms)

    Jo, die rechnet meine Klasse ja dann runter von der eigentlichen Wartezeit. Aber klappt halt nicht...



  • joomoo schrieb:

    Jo, die rechnet meine Klasse ja dann runter von der eigentlichen Wartezeit. Aber klappt halt nicht...

    vielleicht braucht dein malprogramm einfach 15ms pro frame? 😉



  • life schrieb:

    joomoo schrieb:

    Jo, die rechnet meine Klasse ja dann runter von der eigentlichen Wartezeit. Aber klappt halt nicht...

    vielleicht braucht dein malprogramm einfach 15ms pro frame? 😉

    ne, wenn ich die wartezeit abfrage, liegt die so im schnitt bei 9 ms...


Anmelden zum Antworten