2016-07-26 32 views
0

私は、Windowsで使用するための高速でかなり正確なゲームタイマーを作成しています。高解像度のタイミングにはQueryPerformanceCounter()を使用することをお勧めしますが、期待どおりに動作しますが、実行オーバーヘッドが少ない代替案を探しています。QueryPerformanceCounter()とQueryInterruptTime()とKeQueryInterruptTime()との比較

私はいくつかのグーグルを行い、QueryInterruptTime()とそれに対応するQueryInterruptTimePrecise()の言及を発見しました。これはより正確である必要がありますが、オーバーヘッドが大きくなります。彼らのドキュメント(herehere)は、システム割り込み時間を最も近いシステムティック(または100ns単位)にすることを説明しています。 QueryInterruptTime()はタイミングの候補としてよく見えるようになり始めていますが、そのメリットとその傾向についての説明はほとんどありません。

そして、KeQueryInterruptTime()KeQueryInterruptTimePrecise()があり、私は彼らの "non-Ke"の兄弟とどのように違うか分かりません。

誰でもQueryInterruptTime()とKeQueryInterruptTime()、その相違点、賛否両論を記述し、よりユビキタスなQueryPerformanceCounter()と比較できますか?

+0

実際にこのようなことは必要ですか?ほとんどのゲームコードでは、実際には「今すぐ」の時間を知る必要はなく、フレームが実際にスクリーン上にレンダリングされるときの時間が気になります。したがって、あなたのゲームは、理想化されたレートに従って進行するタイマーを気にします。これは、一貫性のあるユーザーエクスペリエンスを提供することになります。そして、ゲームループは、できるだけこのレートでフレームを画面に送ります。 –

+0

はい、それは事実です、私は単純に、より少ないオーバーヘッドを提供するが、使用するのに十分な堅牢性を持つQPC代替品を見つけるために存在する可能なオプションを列挙して、受け入れ可能なゲームのタイミングを許しています。 –

答えて

2

QueryInterruptTime()およびQueryInterruptTimePrecise()には、Windows 10/Server 2016が最低限必要です。

QueryPerformanceCounter()のマニュアルを読んでいる間は、Acquiring high-resolution time stampsを読んでいる必要があります。これにより、QueryPerformanceCounter()の利点と落とし穴が明確に示されます。この機能は、HPETおよびPMタイマープラットフォーム上で顕著なオーバーヘッドしか示さない。なぜなら、このようなプラットフォーム上でカーネルを移行する必要があるからである。最近のプラットフォームでは、CPUのタイムスタンプカウンタ(TSC)を使用して、非常に少ないオーバーヘッドで計時およびパフォーマンスカウンタのビジネスを行っています。

ちょうど正確な時刻であれば、GetSystemTimePreciseAsFileTime()を見ることもできます。この機能は、Windows 8/Server 2012(デスクトップのみ)からサポートされています。ただし、フードの下でパフォーマンスカウンタも使用されるため、オーバーヘッド(HPET/PMタイマ)の点で同じボトルネックが発生します。

関数QueryInterruptTimePrecise()についても同様です。

機能KeQueryUnbiasedInterruptTime()は、カーネルモードドライバで使用でき、KeQueryInterruptTimePrecise()と比較してスリープ状態を正確にブリッジできます。注:ここではカーネルの移行はありませんが、私が推測しているところでは移行を行う必要があります。

残念ながら、KeQueryUnbiasedInterruptTimePrecise()はありません。

+0

私はQueryPerformanceCounter()に固執すると思います。説明ありがとう :) –

関連する問題