Behandlung einer Update-Schleife mit C ++ Chrono?

7

Ich bin definitiv etwas verloren mit der neuen C ++ Chrono-Bibliothek.

Hier habe ich eine Update-Schleife. Es führt zwei Operationen aus:

%Vor%

Das sind lange Operationen, und es ist schwer zu sagen, wie lange sie sind.

Also messen wir, wie lange sie gedauert haben, dann machen wir ein paar Berechnungen und stellen den besten Weg fest, um update aufzurufen, bevor wir render aufrufen.

Dazu benutze ich die Chrono-Funktion von C ++ 11. Ich wählte es, weil es wie ein guter Deal klang: Genauer, mehr Plattform abhängig. Ich stelle fest, dass ich jetzt mehr Probleme habe als jetzt.

Nachfolgend ist mein Code sowie mein Hauptproblem. Jede Hilfe zu entweder dem Problem oder zu einer richtigen Art, meine Operationen auszuführen, wird dringend benötigt!

Ich habe meine Fragen in Kommentaren direkt neben den Zeilen markiert, die ich im Folgenden wiederholen werde.

Die Header-Datei:

%Vor%

Die vereinfachte Update-Schleife

%Vor%

Die Hauptfrage lautet: Meine mDeltaTime kommt immer winzig raus. Es steckt im Grunde in einer fast unendlichen Schleife. Dies liegt daran, dass die kMaxDeltatime sehr klein ist, aber wenn ich 60 Frames pro Sekunde anvisiere, habe ich nicht die richtigen Millisekunden berechnet?

Hier sind alle Fragen von oben aufgelistet:

%Vor%

Es tut mir leid für die Verwirrung Jungs. Ich fühle mich wie ein Idiot mit dieser Chrono-Bibliothek. Die meisten Hilfeseiten oder Referenzmaterial oder sogar der direkte Code selbst sind sehr verwirrend zu lesen und zu verstehen, auf was ich sie anwende. Hinweise darauf, wie ich nach Lösungen oder Code suchen sollte, sind sehr willkommen!

BEARBEITEN: Joachim wies darauf hin, dass std :: min / max für Millisekunden gut funktioniert! Aktualisierter Code, um Änderungen zu berücksichtigen.

    
MintyAnt 09.02.2013, 06:17
quelle

1 Antwort

18

Wenn Sie std::chrono verwenden, sollten Sie so lange wie möglich Casting-Dauern vermeiden oder Durationen in rohe Integralwerte umwandeln. Stattdessen sollten Sie bei den natürlichen Laufzeiten bleiben und die Typsicherheit ausnutzen, die Durationstypen bieten.

Im Folgenden finden Sie eine Reihe spezifischer Empfehlungen. Für jede Empfehlung ziehe ich Zeilen Ihres Originalcodes und zeige dann, wie ich diese Zeilen umschreiben würde.

%Vor%

Es gibt keinen Grund, diese Art von Berechnungen mit manuellen Konvertierungskonstanten durchzuführen. Stattdessen können Sie tun:

%Vor%
%Vor%

Sie können den Wert einfach in seinem ursprünglichen Typ beibehalten:

%Vor%
%Vor%

Verwenden Sie stattdessen:

%Vor%
%Vor%

Es ist am besten, Code zu schreiben, der chrono::duration -Typen durchgängig verwendet, anstatt generische Typen zu verwenden, aber wenn Sie wirklich einen generischen Typ brauchen (zB wenn Sie long an a übergeben müssen API von Drittanbietern), können Sie Folgendes tun:

%Vor%

Und um das Delta zu bekommen, sollten Sie etwas tun wie:

%Vor%     
bames53 05.04.2013, 17:24
quelle

Tags und Links