Zeitmessung zu ungenau
-
Hoi!
Eine bessere Methode zur bestimmung der Spielperformance ist es nicht die Zeit zwischen zwei Frames zu messen, sondern die Anzahl der Frames in einem bestimmten Zeitraum zu messen - das ist dann auch unabhängig von der Auflösung des benutzten Timers, solange du die Auflösung kennst.
frameCounter++; currentTime = getCurrentTime(); if (timeOfFirstFrame < currentTime) { framesPerTimeUnit = (float) frameCounter / (currentTime - timeOfFirstFrame) * ticksPerTimeUnit; timeOfFirstFrame = currentTime; frameCounter = 0; }Ich denke die Bezeichner sind weitesgehend selbsterklärend. ticksPerTimeUnit ist ein konstanter Wert, der die Auflösung des Timers angibt. getCurrentTime() liefert den aktuellen Wert deines Timers. timeOfFirstFrame und frameCounter müssen beide mit 0 initialisiert werden. Die eigentlichen Anzahl an Frames pro Zeiteinheit (die Zeiteinheit wird im übrigen über die Konstante ticksPerTimeUnit bestimmt) kannst du dann in framesPerTimeUnit ablesen.
Eine möglich Implementation mit Windows API könnte wie folgt aussehen:
#include <windows.h> class Game { private: clock_t m_nFPSFirstRender; int m_nFPSFrameCounter; int m_nFramesPerSecond; public: void draw(void); int getFPS(void); } void Game::draw(void) { // zeichne deine szene hier this->m_nFPSFrameCounter++; clock_t now = clock(); if (this->m_nFPSFirstRender < now) { this->m_nFramesPerSecond = (float)this->m_nFPSFrameCounter / (now - this->m_nFPSFirstRender) * CLOCKS_PER_SEC; this->m_nFPSFrameCounter = 0; this->m_nFPSFirstRender = now; } }
-
dif = (float)(now - last)/100.0f;Habe das nun abgeändert, aber es huckelt dennoch. Ich habe das Programm mal hochgeladen, dann sehr ihr was ich meine. Nach dem PC neustart geht das jetzt besser, aber es ist immernoch ein unnötiges huckeln da, womit man eigentlich leben kann, aber muss ja nicht sein.
http://www.file-upload.net/download-1280274/Release3.rar.html
Bewegen tut man sich indem man mit der Maus an den Rand des Bildschirms fährt.
-
Macht 'ne Sekunde Schwarz im Vollbildmodus und terminiert dann ohne weiteres Zutun; "logtest.txt" ist leer (WinXP, Geforce8800GTS).
Was hat eigentlich die Mausbewegung mit der Framerate zu tun?
-
Nichts, aber wenn man ein standbild hat kann man die Frame rate ja nicht so gut sehen. Die Log Files funktionieren noch icht richtig, und das das Programm sofort beendet finde ich merkwürdig!
-
Ich vermute das liegt an der Auflösung, ich habe mal 800x600 gemacht:
http://www.file-upload.net/download-1280713/Release4.rar.html
-
kein Unterschied.
-
Ich habs mal bei mir ausprobiert, es startet und zeigt mir oben rechts eine Textur auf einer 3D Ebene an. Drücke ich "w", wird das entsprechende Gitternetz angezeigt.
Wo soll es hier jetzt genau ruckeln?
Edit: XP-Pro, 2x2Ghz, 8600GTM
Edit2: Ah, ok, man muss die Maus an den Rand bewegen

Es läuft absolut flüssig, regelmäßig tauchen an den Rändern schwarze Flecken auf wenn der Rand gerade in einem Tal ist.
-
wenn man mit der maus an den rand des bildirms geht, und die camera dann über die "Textur" schwenkt.
-
siehe voriger Post, weiß nicht, ob Du mein 2. Edit mitbekommen hast..
-
Bei höheren FPS scheint das huckeln nicht auf zu treten, erst ab so 20 fps wird das ganz extrem. Die schwarzen flecken sind zu sehen weil ich das Frustum culing nch nicht richtig angepasst habe, das geht noch immer davon aus das die Vertices au der Z Achse immer 0 sind. Mich wundert es das das Programm nicht bei hellihjb läuft.
Das Spiel benutzt 1024 VertexBuffer die alle mit 1089 Vertices gefüllt sind. Zum Texturieren wird VS 1.1 und PS 2.0 verwendet, als Texturfilter beutze ich den ANSISTROPIC Filter. Der Bildschirm hat eine Auflösung von 800x600, 32 Bit, Vsync und kein antialiasing.
Ich könnte mir jetzt nicht erklären woran das nun liegt.
-
Im Buero laeuft's (Geforce8600GT), ruckeln tut nix.
-
Aber warum läuft es bei dir auf dem heimrechner nicht? Das ist wohl eine dieser Fragen die niemals geklärt werden!
-
Ich habe da so ein Artikel gefunden, wo 4 verschiedene Arten der Zeitmessung für Spiele gezeigt werden. http://dewitters.koonsolo.com/gameloop.html
Es wurde auch mein Problem erklärt und warum diese Stotterer zustande kommen. Die letzte Zeitmessungsart soll die wohl best mögliche der 4 sein, leider verstehe ich aber nicht wie ich diese anwenden soll:
const int TICKS_PER_SECOND = 25; const int SKIP_TICKS = 1000 / TICKS_PER_SECOND; const int MAX_FRAMESKIP = 5; DWORD next_game_tick = GetTickCount(); int loops; float interpolation; bool game_is_running = true; while( game_is_running ) { loops = 0; while( GetTickCount() > next_game_tick && loops < MAX_FRAMESKIP) { update_game(); next_game_tick += SKIP_TICKS; loops++; } interpolation = float( GetTickCount() + SKIP_TICKS - next_game_tick ) / float( SKIP_TICKS ); display_game( interpolation ); }Wie muss der Code dann für meine Bewegungsfunktion aussehen, und wie für das Zeichnen? Außerdem habe ich dann ja unterschiedliche Positionen der Objekte, was dazuführt das ich keine KI oder ähnliches mehr verwenden kann.