2016-08-30 13 views
1

私は、3Dシーンを示すWPFアプリケーションを開発しています。私はViewport3Dコントロールを使用してそのシーン内に2D WPFコントロールを表示していますが、複雑なアニメーション3Dジオメトリの透明オーバーレイウィンドウではDirect3D 11ネイティブを使用します。これは正常に動作します。Direct3D 11オーバーレイをWPF Viewport3Dと同期させる方法は?

唯一の問題は、Direct3DオーバーレイウィンドウがWPF Viewport3Dと同期していないため、現在のところ大幅な遅延が発生する可能性があることです。 Direct3DレンダリングのようにViewport3Dレンダリングを更新する必要があるため、カメラを移動したときにのみ表示されます。理想的には、Direct3DバッファをWPFバッファの直後にスワップする必要があります。

私の質問: Viewport3Dがその内容を提示した直後にコードを実行する方法はありますか?少なくともその瞬間に近い?

は、私は(内部) Viewport3DVisualクラスの RenderContentから呼び出されるメソッドを作成するために管理...私も汚いネイティブハックと一緒に暮らすことができ、これはより頻繁に実行される - はきれいソリューションである必要はありませんレンダリングスレッド上には表示されません。

+1

あなたはあなたの問題を解決しようとしたコードを共有する必要があります。それに問題がある場合は、ここで提案/答えを得るでしょう。 –

+0

D3Dで何かを変更した後、Viewport3Dを更新することができます。何故なの? –

+0

@sergeyそうですね、問題は、Viewport3Dがレンダリングを完了し、最終的にアップデートを表示するまでに時間がかかることです。実際には、WPFは何も表示せずに複数回レンダリングを開始する可能性がありますバッファ。したがって、Viewport3Dは古いシーンを表示しますが、更新されたDirect3Dオーバーレイはすでに表示されています。 これは、 'RenderContent'の私のフックが良い解決策ではない理由でもあります。レンダリングは必ずしもWPFのフロントバッファの次のものに近いとは限りません。 –

答えて

0

私は解決策を見つけました。リフレクションを使用して内部MediaContextクラスの内部RenderCompleteイベントにイベントハンドラを追加することが可能である:

Assembly oAssemblyPresentationCore = typeof(Visual).Assembly; 
Type oTypeMediaContext = oAssemblyPresentationCore.GetType("System.Windows.Media.MediaContext"); 
MethodInfo oMethodInfoGetMediaContextFromDispatcher = oTypeMediaContext.GetMethod("From", BindingFlags.Static | BindingFlags.NonPublic); 
object oMediaContext = oMethodInfoGetMediaContextFromDispatcher.Invoke(null, new object[] { oViewport3D.Dispatcher }); 
EventInfo oEventInfoRenderComplete = oMediaContext.GetType().GetEvent("RenderComplete", BindingFlags.NonPublic | BindingFlags.Instance); 
oEventInfoRenderComplete.GetAddMethod(true).Invoke(oMediaContext, new object[] { new EventHandler(EventHandlerRendered) }); 
関連する問題