2012-04-18 18 views
4

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

たとえば、WPF/Silverlight/WinRTアプリケーションでこれを行うことができます。ブラウザーやメディアプレーヤーも同様です。 Win32アプリケーションと同じエフェクトを実現するために、どのようにこれを行うのですか?

クロックポーリングは、CPUをスパイクするので、もちろん機能しません。 Sleep()もありません。なぜなら、せいぜい50ms程度の粒度しか得られないからです。

答えて

5

彼らはマルチメディアタイマーを使用しています。情報はMSDNにありますhere

マルチメディアタイマーイベントごとにビューが無効になります(f.e. InvalidateRect)。描画はWM_PAINT/OnPaintハンドラで行われます。

+0

これは実際には[キュータイマ](http://blogs.msdn.com/b/larryosterman/archive/2005/09/08/462477.aspx)の代わりに廃止されたようです。 –

+0

[timeSetEvent](http://msdn.microsoft.com/en-us/library/windows/desktop/dd757634(v = vs.85).aspx)の情報ページで、Ken Smith氏はマルチメディアタイマーはまだ信頼性の高い、Windowsで利用可能な高解像度タイマーのみ。私は両方をチェックアウトして、あなたのアプリケーションに最適なものを見てください。 –

+0

Bleh、私は彼らが物事を非難する前に、適切な選択肢を作ることを望む。それから、もう一度、私はこれがゲームのために十分であると思います... –

1

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

QueryPerformanceCounter/QueryPerformanceFrequencyの組み合わせを使用すると、非常に正確なタイミングを得ることができます。平均して、平均して正確に前進するようなループを作成することができます。

私はそれが50msものデッドラインを見逃すことはありませんでしたが、私はドリフトする素朴なタイマーをたくさん見ました。すなわち、小さな遅延を累積し、注目に値する不規則な間隔を強制的に更新する。これはフレームレートの不均一を引き起こします。

n番目のフレームごとに非常に短いビープ音を鳴らすと、これは非常に聞き取りやすいものです。

また、ロジックとレンダリングを互いに独立して実行することもできます。 CPUが忙しいとは思われないかもしれませんが、私はあなたがGPUが仕事に苦労していると賭けています。

ここで、CPUを嫌うことはありません。 CPU使用率は、特定のサンプルでプロセスが費やしたCPU時間を分解したものに過ぎません(スレッドスケジューラが実際にこれを追跡します)。あなたのゲームに30 Hzのターゲットがある場合。あなたはフレームあたり33msに制限されています。そうしないと遅すぎる(CPUが遅すぎる、またはコードが遅すぎる)場合は、30Hzで実行されず、33msプロセッサ時間を節約し、効果的にリソースを解放することができます。

Thisもあなたのための読み物になります。

時間の節約ではなく、将来の計算のためのプレップワークを効果的に行うことができます。負荷の重いものの下にないときのゲームの中には、ソートやメモリの最適化として実際にやることがありますが、ここではちょっとしたことがあります。

関連する問題