1

D3DImageを使用してSharpDXDirectX9サーフェスをホストし、パン、ズーム、およびワールドオブジェクトとの対話を可能にするコントロールがあり、その結果は本当に素晴らしいものです。ウィンドウが最小化されて元に戻された場合、またはユーザーが画面をロックしてからロック解除した場合を除いて、パフォーマンスは実際には驚くほど一貫した60fpsです。ウィンドウがフォーカスを取り戻すと、fpsは約25〜30fpsに低下します。コントロールをアンロードしてコンテナにロードし直してから、60 fpsのBOOMを実行することで、この問題を「修正」できます。

10msに設定されたDispatcherTimerを使用してメインレンダリング関数を呼び出します。以前は、CompositionTarget.Renderingイベントを使用していましたが、DispatcherTimerを使用した場合ほどパフォーマンスは良くありませんでした。私は失われたリソースを正しく処理しているとかなり確信しています。これらの1秒あたりの欠落フレームに関するアイデアはありますか?

編集: 私はこれとまったく同じ問題を抱えています。残念ながら、デバイスの自動リセットを実行しても問題は解決しませんが、同じリセット方法を実行するボタンがある場合、fpsは通常に戻ります。

4

2 に答える 2

2

画面をロック/ロック解除すると、デバイスが失われます。しかし、あなたはおそらくそれを知っています。

とにかく、WPFでもD3DImageを使用しています。私が電話したとき、パフォーマンスの問題は解決しました

D3DImage.SetBackBuffer(D3DResourceType.IDirect3DSurface9, IntPtr.Zero)

失われた各デバイスで。WPF がまだテクスチャへの参照を保持していることに気付くまで、デバイスが失われた後、応答性の問題が発生していました。もちろん、テクスチャを更新したら、後でバックバッファを再設定する必要があります。

バックグラウンドで正確に何が問題になっているのかは不明ですが、D3DImage がテクスチャへの参照カウントを保持していることは明らかです。これにより、デバイスが失われた場合に正常な回復が妨げられる可能性があります。私の場合、単に更新がありませんでした。

逸話的な回答で申し訳ありません...しかし、実際の D3DImage の専門家が部屋に入るまでは、何もないよりはましです。

PS私はSlimDXを使用していますが、それは問題ではないと思います...私が知っている限り、SharpDXはSlimDXのフォークです。

于 2012-11-13T22:05:29.803 に答える
0

追加のフラグSetBackBufferを取るオーバーロードがあります。Boolean

D3DImage.SetBackBuffer(D3DResourceType, IntPtr, Boolean)

SetBackBuffer (D3DResourceType, IntPtr) オーバーロードを呼び出すか、enableSoftwareFallback パラメーターを false に設定して SetBackBuffer(D3DResourceType, IntPtr, Boolean) オーバーロードを呼び出す、[WPF] レンダリング システムは、フロント バッファーが次のようになると、バック バッファーへの参照を解放します。利用できず、何も表示されません。

私も専門家ではありませんが、これが起こっていることだと思います。そのフラグを「true」に設定しなかったため、WPF はRelease()、ロックを終了するとすぐに、D3D サーフェスの最後の COM ref カウントを呼び出しています。これには、独自の追加の参照カウントを維持する必要があるようです。

1 つには、WPF のロック/ロック解除の往復から「使用済みの」サーフェスを「取り戻した」後でも、次のサーフェスが代わりになるまで解放しない必要があることに気付きました (つまり、成功した場合)。 d3dimg.SetBackBufferへの呼び出し)。そうしないと、WPF ウィンドウを画面上でドラッグしたときにちらつきが発生します。これが、WPF が実際にバッファーを処理したことを検出するために私が発見した唯一の信頼できる方法であることを考えると、WPF がAddRef や Release に関与することは無意味に思えます。

一般的に混乱しているのD3DImageは、 WPF を実行している が、WPF のバック バッファーとして提示しているサーフェスを生成IDirect3DDevice9した と実際には関連付けられていないことです。IDirect3DDevice9ビジネス全体はおそらくWPFの利益のためであり、あなた自身の(おそらくロック可能?)レンダーターゲットの生存Lock/Unlockとは何の関係もありません。IDirect3DSurface9


注意してください!
を使用する場合D3DImage.TryLockは、その、うーん... 型にはまらないセマンティクスに注意してください。 where がfalseを返すUnlock場合でも呼び出す必要があります。詳細については、https://stackoverflow.com/a/39581727/147511を参照してください。TryLock

于 2016-09-19T19:19:11.003 に答える