5

Windows には、CPU をスパイクすることなく、かなり高く安定したフレームレートでコードをトリガーするアプリケーションの例がたくさんあります。

たとえば、WPF/Silverlight/WinRT アプリケーションでこれを行うことができます。ブラウザやメディア プレーヤーも同様です。Win32 アプリケーションから同じ効果を得るには、どのような API 呼び出しを行うのでしょうか?

もちろん、クロック ポーリングは機能しません。CPU の使用率が急上昇するからです。Sleep()せいぜい50ミリ秒程度の粒度しか得られないためです。

4

2 に答える 2

5

彼らはマルチメディア タイマーを使用しています。ここで MSDN に関する情報を見つけることができます。

各マルチメディア タイマー イベントでは、ビューのみが無効化されます ( InvalidateRectを使用した場合)。描画はWM_PAINT/OnPaintハンドラで行われます。

于 2012-04-18T11:35:43.497 に答える
1

実際、睡眠には何の問題もありません。

QueryPerformanceCounter/QueryPerformanceFrequency の組み合わせを使用して、非常に正確なタイミングを取得できます。また、平均して、想定どおりに正確に進むループを作成できます。

デッドラインに 50 ミリ秒も遅れるスリープを見たことはありませんが、ドリフトする素朴なタイマーをたくさん見てきました。つまり、わずかな遅延を蓄積し、顕著な不規則な間隔を偶発的に更新します。これが不均一なフレームレートの原因です。

n:th フレームごとに非常に短いビープ音を鳴らすと、非常に聞き取りやすくなります。

また、ロジックとレンダリングは互いに独立して実行できます。CPU はそれほど忙しくないように見えるかもしれませんが、GPU は一生懸命働いているに違いありません。

さて、CPUを占有しないことについて。CPU 使用率は、特定のサンプルでプロセスが費やした CPU 時間の内訳です (スレッド スケジューラは実際にこれを追跡します)。ゲームのターゲットが 30 Hz の場合。フレームごとに 33 ミリ秒に制限されています。そうしないと、遅れが生じます (CPU が遅すぎるか、コードが遅すぎる)。このターゲットにヒットできない場合は、30 Hz で実行されず、33 ミリ秒未満でヒットした場合次に、プロセッサ時間を確保して、リソースを効果的に解放できます。

これはあなたにとっても興味深い読み物かもしれません。

余談ですが、時間を割く代わりに、将来の計算の準備作業を効果的に行うことができます。一部のゲームは、最も負荷が高くない場合でも、実際には並べ替えやメモリの最適化などの処理を実行します。

于 2012-04-18T12:11:52.257 に答える