1 つのスレッドが一定レートのシーン更新 (120Hz) を実行し、別のスレッドがレンダリング (潜在的に非常に短いフレーム時間、たとえば 400Hz) を実行し、共有データがトリプル バッファリングされるマルチスレッド 3D アプリケーションを実装しようとしています。タイミングに関するMSDNの記事によると、QueryPerformanceCounter
複数のスレッドで使用するとパフォーマンスが低下します。
複数のスレッドでタイミングを計算すると (たとえば、各スレッドが特定のプロセッサに関連付けられている場合)、マルチコア システムのパフォーマンスが大幅に低下します。
ただし、更新が正しい間隔で行われることを保証するために更新スレッドで高精度のタイミングが必要であり、補間のために正確なフレーム時間を取得するためにレンダリング スレッドで必要とされるので、これを解決する一般的な方法は何ですか?
アップデート:
このパフォーマンスの「大幅な低下」をテストするための小さなテスト プログラムを作成しました。QueryPerformanceCounter
100000000回の呼び出しの実行を計ります。これを 1 つのスレッドに対して実行し、別のコアで 2 つのスレッドに対して並行して実行します。記事のアドバイスによると、各スレッドのアフィニティは個別のコアに設定されています。私のマシンでのテストの結果は、記事の言葉からすれば驚くべきものです。
結果:
注: これらの結果には、ループ カウンター (64 ビット int) のインクリメントとループの先頭へのジャンプに費やされた時間が含まれているため、実際の実行時間は短くなります。
1 Thread: Execution in 3255313449 ns Approximately 32.6 ns per call 2 Threads: Thread 1: Execution in 3278105881 ns Approximately 32.8 ns per call Thread 2: Execution in 3271422015 ns Approximately 32.7 ns per call
これは、呼び出しに 2 つのスレッドを使用してもパフォーマンスに大きな影響がないことを示していますQueryPerformanceCounter
。これは異常な動作ですか、それとも最新のマシンの大部分に対してこの記事は正しくありませんか?