Ich habe mir verschiedene Spiel-Timing-Loop-Verfahren angesehen, z. Glenn Fiedler und DeWitter. Ich fand kritische Bereiche aufgrund meiner eigenen C ++ - Wissensbeschränkungen schwer zu verstehen. Ich machte mich daran, meine eigene Methode zu implementieren ... Ich dachte mir eine gute Möglichkeit, etwas über diese Methoden zu verstehen.
[edit1: Ich verwende CodeBlocks IDE mit minGW-w64 (x64-4.8.1-posix-seh-rev5) als Compiler]
[edit2: Code und Ausgabefenster wurden um einen dritten Timer, QueryPerformanceCounter] erweitert
Beim Versuch, dies zu erreichen, stieß ich auf das folgende Problem:
Minimaler Code:
%Vor%Zu Vergleichszwecken verwendet der obige Code zwei Timer.
Auf meinem PC lautet die Ausgabe wie folgt:
%Vor% Mit duration_cast<microseconds>(finish - start).count()/1000.0
für die steady_clock sehen wir folgendes: -
Beachten Sie, dass die Uhr mit hoher Auflösung zwischen 0 und 15,6 ms schwankt und den steady_clock-Vergleich feststellt.
Das Problem, das ich habe, ist, dass wenn ich eine feste Spielschleife implementieren würde, wo der update () - Code die Entity-Positionen bei exakt 1000/60 (60 Update-Zyklen pro Sekunde) dh alle 16,666etc ms - aktualisiert Das ist sehr nah an den zurückgegebenen Hires Timer schwankenden Wert! Das eigentliche Problem ist, dass, wenn ich auch einen Akkumulator implementiere, um beide Game-Loop-Frame-Zeiten, die unter 1000 / 60ms sind, und alle übrig gebliebenen, wenn update () abgeschlossen ist, die Update-Schleife früher - und zu unregelmäßigen Zeitpunkten - als eingegeben wird es sollte.
Gibt es ein Problem mit dem oben genannten minimalen Code, und wenn nicht, sollte ich mich damit befassen, wenn eine korrekte Implementierung für eine bestimmte Zeit durchgeführt wird? Gibt es außerdem, und wenn es relevant ist, eine Möglichkeit, ein Programm / einen Thread so zu isolieren, dass es nicht durch System-IRQ oder andere Abfrageereignisse unterbrochen wird? Ich schätze, der Hires-Timer kann solchen Unterbrechungen unterliegen.
Es gibt einen Fehler in der Standardbibliothek von std::chrono
.
Ich kenne einen solchen Fehler in Visual C ++, ich bin mir nicht sicher, welchen Compiler Sie verwenden, aber wenn Unterstützung für std::chrono
ein neuer Zusatz ist, könnten sie immer noch einige Fehler haben.
Wenn Sie Visual C ++ verwenden, sollten Sie Folgendes beachten: