2015-09-15 6 views
5

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の両方でそれをテストしてみた

SmoothAnimationTest.zip

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は数ミリ秒以上ブロックすることがあり、アニメーションのジャダーが発生する可能性があります。

+1

私はプロキシされたネットワーク上にあるのでサンプルプロジェクトをダウンロードできません。 「バックグラウンドスレッドでコントロールをホストする」とはどういう意味ですか? –

+2

あなたのアプリケーションは後方にあるようです。メインスレッドではUIが必要で、UIをブロックできる長期実行プロセスはバックグラウンドスレッドで実行されます。 –

+0

HostVisualを使用して背景のスレッドにカスタムコントロールを含める[リンク](http://blogs.msdn.com/b/dwayneneed/archive/2007/04/26/multithreaded-ui-hostvisual.aspx) –

答えて

0

これは完全な回答ではないかもしれませんが、私はコメントとして書かないことをお勧めします。

まず、.Net 4.6では問題がないことを確認しましたか? Win 10は、Win 8.1に同梱の.Net 4.5を置き換える.Net 4.6で出荷されます。 .Net 4.6にはかなりの内部的な変更と新しいバグが含まれています。私はあなたの最初のステップとしてこれを確認するためにWin 8.1に.Net 4.6をインストールします... (もしバグが.Net 4.6の場合はConnectで報告しなければなりませんが、

第2に、コントロールの表示方法は正確にわかりませんが、second dispatcherが必要なように聞こえます。しかし、別のウィンドウが必要です。このようにして、メインウィンドウで何が起きても、セカンダリウィンドウには影響しません。

私が言ったように、このオプションがあなたのシナリオで実行可能かどうかは分かりません。たぶん、第2のウィンドウの境界線がなく、最上部にあり、最初のウィンドウと重なっているかもしれません...

関連する問題