私はゲームエンジンを書いていますが、デバッグ用の現在のFPSを導出し、フレームレートを制限するための正確で正確な「デルタタイム」値を取得する方法が必要です(これは私たちのプロジェクトにとって重要です)。
少し調べてみると、これを行うための最良の方法の1つは、WinAPIのQueryPerformanceCounter
関数を使用することです。フォワードカウンターの跳躍GetTicksCount
を防ぐために使用する必要がありますが、それ自体はあまり正確ではありません。
ここでの問題QueryPerformanceCounter
は、時間がワープバックした場合のように見える値を返す可能性があることです(つまり、呼び出しが過去の別の呼び出しよりも前の値を返す場合があります)。これは、特定のプロセッサコアで取得した値を別のプロセッサコアで取得した値と比較した場合にのみ発生します。これにより、この投稿を行う動機となった最終的な質問につながります。
- スレッドがすでに実行されている間にOSがスレッドを別のコアに「再割り当て」することはできますか、それともスレッドが特定のコアに割り当てられ、スレッドが終了するまでそれでしょうか。
- スレッドを再割り当てできない場合(少なくとも私にとっては非常に理にかなっています)、なぜ私が次のようなことを行うことができるの
SetThreadAffinityMask(GetCurrentThread(),mask)
ですか?Ogre3DはそのOgre::Timerクラス(Windows実装)でそれを行います、そして私はそれが時間を遡ることを避けるためであると仮定しています。しかし、それが真実であるためには、OSによってスレッドが1つのコアから別のコアに任意に移動される可能性を考慮する必要があります。これは、私にはかなり奇妙に思えます(理由はわかりません)。
今のところ知りたかったのはそれだけだったと思います。ありがとう。