5

完成間近の SharpDX プロジェクトがあります。対話には Kinect を使用します。このため、私のプロジェクトでは Kinect 領域と KinectUserViewer オブジェクトの両方に WPF を使用しています。SharpDX はこれまでのところすべてにうまく機能していましたが、direct3D を多用するプログラムの特定の部分に到達すると、ちらつき始めます。これは、D3Dimage (MainWindow.xaml の SharpDXElement によって利用される) が「根本的に壊れており、WPF での効率的な D3D レンダリングには適していない」可能性があるという事実に明らかに関連しています[1]。WPF 要素を保持し、direct3D でちらつきを防ぐ方法はありますか?

4

4 に答える 4

2

問題はロック機構ではありません。通常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 テクスチャです)は、レンダリングの準備が整うまで待機し、コピーを作成します。

これでちらつきが解消されました…。

于 2016-11-11T14:41:41.653 に答える
1

私は同じ問題を抱えていて、DeviceCreationFlags.SingleThreaded助けてくれました。

于 2016-05-11T10:42:15.327 に答える