2016-07-26 9 views
0

Ich schreibe einen schnellen und ziemlich genau Spiel-Timer für die Verwendung unter Windows. Microsoft empfiehlt die Verwendung von QueryPerformanceCounter() für das Timing mit hoher Auflösung, und es funktioniert wie erwartet, aber ich suche nach Alternativen, die weniger Ausführungsaufwand ergeben.QueryPerformanceCounter() vs QueryInterruptTime() vs KeQueryInterruptTime()

Ich habe etwas Googeln und fand die Erwähnung von QueryInterruptTime(), und sein Gegenstück QueryInterruptTimePrecise(), die präziser sein sollte, aber mehr Aufwand verursacht. Ihre Dokumentation (here und here) beschreibt, dass sie die Anzahl der Systemunterbrechungszeiten zum nächsten System-Tick (oder 100ns-Einheit) bringen. QueryInterruptTime() fängt an, als Timing-Kandidat gut auszusehen, aber es gibt sehr wenig Dokumentation seiner Vorteile und seiner Macken.

Und dann gibt es KeQueryInterruptTime() und KeQueryInterruptTimePrecise(), und ich habe keine Ahnung, wie sie sich von ihren "non-Ke" Geschwister unterscheiden.

Kann jemand QueryInterruptTime() und KeQueryInterruptTime() beschreiben, ihre Unterschiede, Vor- und Nachteile, und vergleichen Sie sie mit der ubiquitärer QueryPerformanceCounter() bitte?

+0

Ist so etwas eigentlich eine Anforderung? Der meiste Spielecode muss die Zeit "gerade jetzt" nicht wirklich wissen, sondern interessiert sich dafür, wie die Zeit sein wird, wenn der Rahmen tatsächlich auf dem Bildschirm gerendert wird. Daher interessiert sich Ihr Spiel eigentlich für den Timer, der nach einer idealisierten Rate fortschreitet - was die konsistenteste Benutzererfahrung bietet - und die Spielschleife liefert Frames dann - möglichst nahe dieser Rate - auf den Bildschirm - möglicherweise mit vsync . –

+0

Ja, das ist wahr, ich zähle einfach die möglichen Optionen auf, die existieren, um zu versuchen, eine QPC-Alternative zu finden, die weniger Overhead bietet, aber robust genug ist, um akzeptables Spieltiming zu ermöglichen. –

Antwort

2

QueryInterruptTime() und QueryInterruptTimePrecise() erfordern Windows 10/Server 2016 als Mindestversionen.

Sie müssen Acquiring high-resolution time stamps gelesen haben, während Sie die QueryPerformanceCounter() Dokumentation gelesen haben. Dies offenbart deutlich die Vorteile und Nachteile von QueryPerformanceCounter(). Die Funktion zeigt nur einen bemerkenswerten Overhead auf HPET- und PM-Timer-Plattformen, da auf solchen Plattformen ein Kernel-Übergang erforderlich ist. Neuere Plattformen führen Zeiterfassungs- und Leistungsindikatorgeschäfte unter Verwendung des CPU-Zeitstempelzählers (TSC) mit sehr geringem Aufwand durch.

Wenn es nur um genaue Zeit ist, können Sie auch in GetSystemTimePreciseAsFileTime() suchen. Diese Funktion wird von Windows 8/Server 2012 (nur Desktop) unterstützt. Es verwendet jedoch auch den Leistungszähler unter der Haube und leidet daher unter dem gleichen Engpass in Bezug auf den Overhead (HPET/PM-Zeitgeber).

Das Gleiche gilt für die Funktion QueryInterruptTimePrecise().

Die Funktion KeQueryUnbiasedInterruptTime() kann in Kernelmodustreibern verwendet werden und kann im Vergleich zu KeQueryInterruptTimePrecise() die Schlafzustände genau überbrücken. Hinweis: Kein Kernel-Übergang hier, aber Sie müssten den Übergang woanders machen, vermute ich.

Leider gibt es keine KeQueryUnbiasedInterruptTimePrecise().

+0

Ich denke, ich bleibe bei QueryPerformanceCounter(). Danke für die Erklärung :) –

Verwandte Themen