WPF と C# を使用して、タッチ テーブルのアプリケーションを作成しています。(そして、私は WPF にあまり詳しくありません。まったくです。) API から「要求」しているフレームレートを取得していないと思われるため、独自の FPS 計算機を作成しようとしています。内部クロックに基づいて計算する数学は知っていますが、Windows/WPF API 内でタイマーにアクセスする方法がわかりません。
タイマーにアクセスするには、どのライブラリ/コマンドが必要ですか?
WPF と C# を使用して、タッチ テーブルのアプリケーションを作成しています。(そして、私は WPF にあまり詳しくありません。まったくです。) API から「要求」しているフレームレートを取得していないと思われるため、独自の FPS 計算機を作成しようとしています。内部クロックに基づいて計算する数学は知っていますが、Windows/WPF API 内でタイマーにアクセスする方法がわかりません。
タイマーにアクセスするには、どのライブラリ/コマンドが必要ですか?
DispatcherTimer(UIスレッドにティックをマーシャルして相対性の問題を引き起こす)またはSystem.Threading.Timer(UIコントロールに触れようとすると例外をスローする可能性があります)を使用することもできますが、WPFプロファイリングツールを使用します:)
StopWatchを探していると思います。初期化して、反復の開始ごとにリセットするだけです。反復の最後に、計算を行います。
まず第一に、WPF が画面を更新しているフレーム レートを示す無料の診断ツールを Microsoft が提供していることをご存知ですか? 求めているフレームレートが得られていると確信できない場合は、信頼できないかもしれませんが、信頼できるツールであることがわかりました. これは Perforator と呼ばれ、WPF Performance Suite の一部であり、次の手順に従って入手できます: http://msdn.microsoft.com/library/aa969767
それはおそらく自分で書くよりも簡単です。
また、フレームレートをどのくらい正確に「要求」していますか? どの API を使用していますか? Timeline の DesiredFrameRate プロパティを使用していますか? その場合、これはフレーム レートを上げるよりも下げるために一般的に使用されます。(ドキュメントでは、テアリングを回避するためにフレーム レートを上げることについても説明されていますが、それは実際には意味がありません。テアリングは、フレームがモニターと同期していないことによって引き起こされ、遅いフレーム レートのアーティファクトではありません。いずれにせよ、 、Vista または Windows 7 では、DWM を有効にするとテアリングが発生しません。) これは単なるヒントであり、WPF は推奨されるフレーム レートに一致することを保証しません。
測定方法に関しては、いくつかの方法があります。フレーム レートが適切な範囲内にあるかどうかを調べようとしているだけの場合は、フレームごとに 1 回カウンターをインクリメントし (これは通常、 のイベント ハンドラーで行いますCompositionTarget.Rendering
)、DispatcherTimer を 1 回起動するように設定します。 UI に値を表示してから、カウンターをリセットします。完全に正確ではないため、多少ラフで準備ができてDispatcherTimer
いますが、たとえば、30 fps を期待していたときに 15 fps を取得したかどうかが表示されます。
より正確なビューを取得しようとしている場合 (たとえば、フレームが常にレンダリングされているかどうか、または時々フレームが失われているように見える場合)、それはもう少し複雑になります。 . しかし、さらに提案を行う前に、Perforator がそのトリックを行うかどうかを確認するのを待ちます。
QueryPerformanceCounter
p / Invokeを使用して、通常呼び出すwin32タイミング呼び出し(など)をラップするか、すでにラップされている.NETの何かを使用する必要があります。
を使用することもできますDateTime.Ticks
が、おそらく十分な解像度ではありません。Stopwatchクラスは、内部でQueryPerformanceCounterを使用します。
単純な診断ではなく、多くのシステムで再利用可能なものが必要な場合は、QPCとストップウォッチのプロセッサ関連の問題について警告してください。この質問を参照してください:.NETストップウォッチクラスはこれほどひどいものになる可能性がありますか?