UIスレッドがブロックされても、一定の60 FPSでアニメーションを表示できるように、バックグラウンドスレッドでコントロールをホストしようとしています。これはWindows 8.1で完全に機能しましたが、Windows 10にアップグレードして以降は失敗します。Windows 10のバックグラウンドスレッドでコントロールを実行しているときに、WPFアプリケーションで滑らかな60 FPSアニメーションが得られないのはなぜですか?
私はCompositionTarget.Renderingイベントをコントロールをホストしているバックグラウンドスレッドからフックして、アニメーションをモニターの更新と同期させることができます。しかし、メインUIスレッドの何かがレンダリングイベントにフックすると、メインUIスレッドでホストされているビジュアルが変更されるたびにフレームがスキップされるように見えます。
RenderingEventArgsクラスに公開されているRenderTimeに従って、スキップされたフレームを視覚的に見ることができます。これは、フレームスキップが発生するたびに最後のフレームからの時間デルタが16msではなく約33msであるためです。
UIスキンでCompositionTarget.Renderingイベントをフックし、イベントハンドラで何もしないか、ストーリーボードアニメーションを開始することでスキップすることができます。これは、ストーリーボードアニメーションがCompositionTarget.Renderingイベントをフックして達成するためです滑らかなアニメーション。ここで
問題を示して簡単なサンプルプロジェクトです:私は完全に "とのすべての場合のWindows 8.1の実行中に、複数のマシン上のWindows 8.1とWindows 10の両方でそれをテストしてみた
60 FPSで動作する「独自のスレッド」コントロールWindows 10では、「Show Judder 1」はフレームレートを一定の30 FPSに減らし、「Show Judder 2」はフレームレートを30〜60 FPSの間で不規則に切り替えるようにし、平均で約45〜50になります。
Windows 8.1とWindows 10の両方で、[UIスレッドをブロック]ボタンを押すと、独立したスレッドコントロールで60FPSがスムーズになります。
解決策は、UIスレッドでアニメーションを実行し、そのスレッドからすべてのブロックコードを削除することですが、残念ながら、これは簡単な作業ではありません。私が作業しているアプリケーションが複雑で、 UIは数ミリ秒以上ブロックすることがあり、アニメーションのジャダーが発生する可能性があります。
私はプロキシされたネットワーク上にあるのでサンプルプロジェクトをダウンロードできません。 「バックグラウンドスレッドでコントロールをホストする」とはどういう意味ですか? –
あなたのアプリケーションは後方にあるようです。メインスレッドではUIが必要で、UIをブロックできる長期実行プロセスはバックグラウンドスレッドで実行されます。 –
HostVisualを使用して背景のスレッドにカスタムコントロールを含める[リンク](http://blogs.msdn.com/b/dwayneneed/archive/2007/04/26/multithreaded-ui-hostvisual.aspx) –