2012-03-27 32 views
2

こんにちは私はD3DImageと共有テクスチャを使ってWPFアプリケーションでSlimDXとDirectX 11グラフィックスを統合することができました。しかし、高解像度(2560x1440)でシンプルなシーン(SlimDXサンプルのGameOfLifeなど)をレンダリングすると、パフォーマンスが低下します。WPFとSlimDX(DirectX 11)interop

私のレンダリングメソッドのパフォーマンスプロファイリングを試してみましたが、バックバッファを無効にするときにD3DImageをロックするのにほとんどの時間が費やされているようです。

_device.ImmediateContext.Flush(); // <- 20,6% of the time when rendering the frame 

誰もが問題を知っているとどのようにこれを最適化する:

_d3dImage.Lock(); // <- this call takes 78,5 % of the time when rendering the frame 
_d3dImage.AddDirtyRect(new Int32Rect(0, 0, _d3dImage.PixelWidth, _d3dImage.PixelHeight)); 
_d3dImage.Unlock(); 

多くの時間を描画した後、デバイスをflusing費やされていますか? WPFとSlimDXの統合時に降下パフォーマンスを期待できますか?

+1

ロックは、UIスレッドがバックバッファの読み込みを停止するまでスレッドをブロックします。フラッシングは非常に高価ですので、これらの結果は珍しいことではありません。あなたの実際のパフォーマンスの数字は何ですか?あなたのGPUはシェーダの計算をサポートしていますか?そうでなければ、それはソフトウェアで(すなわち、匂いの速さで)実行されるだろう。 –

+0

問題は、GameOfLifeサンプルで使用されている計算シェーダと何か関係があるようです。私がそれを無効にすると、フレームレートは60fpsに戻ります... – Pking

答えて

1

コールをロックしてフラッシュする際のパフォーマンス上の問題(GPUがCPUと同期する必要があるポイントです)が表示されているので、プログラムが厳しくGPUにバインドされていると思います.CPUは、追いつくのを待っている。これは、計算シェーダを無効にするときのパフォーマンスの向上によっても生まれます。

私はその時点であなたに何を伝えるべきかはわかりませんが、その推測が正しいとカードが負荷を処理できないように見える場合を除きます。

+0

ありがとう、そうそうです。私は想像する負荷を処理すべきRadeon HD5850を実行していますが、シェーダはそれほど複雑ではありません。 – Pking

+1

それは確かにそこにあるすべてではありません。私はLock()が永遠に続くという同じ問題を抱えており、DirectXをWindows Formsでホ​​ストするとパフォーマンスが大幅に向上します。 –

+0

それは面白いです。多分WPF + Dxはそうではなかったでしょう。 – Pking

関連する問題