完成間近の SharpDX プロジェクトがあります。対話には Kinect を使用します。このため、私のプロジェクトでは Kinect 領域と KinectUserViewer オブジェクトの両方に WPF を使用しています。SharpDX はこれまでのところすべてにうまく機能していましたが、direct3D を多用するプログラムの特定の部分に到達すると、ちらつき始めます。これは、D3Dimage (MainWindow.xaml の SharpDXElement によって利用される) が「根本的に壊れており、WPF での効率的な D3D レンダリングには適していない」可能性があるという事実に明らかに関連しています[1]。WPF 要素を保持し、direct3D でちらつきを防ぐ方法はありますか?
4 に答える
問題はロック機構ではありません。通常Present
、イメージを提示するために描画するために使用します。Present
すべての描画の準備が整うまで待機します。Present()
D3DImage では、メソッドを使用していません。プレゼンテーションの代わりに、DirtyRect を追加してロックし、ロックを解除しD3DImage
ます。
レンダリングは非同期で行われるため、ロックを解除すると、描画アクションの準備ができていない可能性があります。これがフリッカー効果の原因です。途中で描いたものを時々見かけます。貧弱な解決策(私がテストしたもの)は、ロックを解除する前にわずかな遅延を追加することです。少しは役に立ちましたが、きちんとした解決策ではありませんでした。ひどかった!
解決:
私は別のことを続けました。私は MSAA (アンチエイリアシング)を試していましたが、最初に直面した問題は次のとおりでした。MSAA は dx11/dx9 共有テクスチャでは実行できないため、新しいテクスチャ(dx11)にレンダリングし、dx9 共有テクスチャへのコピーを作成することにしました。テーブルに頭をぶつけたのは、今ではアンチエイリアスとフリックがなくなったからです!!
コピー アクションは、すべての描画の準備が整うまで (もちろん) 待機しているように見えますが、描画を完了するのに役立ちます。
したがって、テクスチャのコピーを作成します。
DXDevice11.Device.ImmediateContext.ResolveSubresource(
_dx11RenderTexture, 0, _dx11BackpageTexture, 0, ColorFormat);
(_dx11BackpageTexture
は共有テクスチャで、_dx11RenderTexture
は MSAA dx11 テクスチャです)は、レンダリングの準備が整うまで待機し、コピーを作成します。
これでちらつきが解消されました…。
私は同じ問題を抱えていて、DeviceCreationFlags.SingleThreaded
助けてくれました。