5

アンマネージ C++ コードから DirectX 11 を使用し、GUI に WFP を使用したいと考えています。SlimDX は私には適していません。DirectX 10でWPFを機能させるための解決策を見つけました:

D3DImage 経由の WPF と DirectX 10

しかし、私は DirectX 11 でそれを動作させることができませんでした。2 つのボタンがある空白の画面だけです。WPF を DirectX 11 で動作させる方法を知っている人はいますか?

また、この例を実行しているとき、Intel i5 750 (Windows 7 64 ビット、NVidia Geforce 430) の CPU 使用率が約 4 ~ 5% であることも確認しました。多すぎると思います..CPU使用率を下げることはできますか?

ここで私のコードを見つけることができます: http://www.gamedev.net/topic/619534-wpf-directx-11-via-d3dimage/

4

3 に答える 3

3

頂点バッファー レイアウトに間違った形式を使用しました。DXGI_FORMAT_B8G8R8A8_UNORM を使用しましたが、私の場合は DXGI_FORMAT_R32G32B32_FLOAT を使用する必要があります。

于 2012-02-02T17:09:31.423 に答える
2

D3DImage.AddDirtyRect への呼び出しがありません。Direct3D11 でシーンをレンダリングした後、表示する準備が整った新しい画像があることを WPF に伝える必要があります。これを行うには、以下を実行します。ここで、d3dimage は D3DImage インスタンスです。

d3dimage.Lock();

//...
//your render code
///...

var surface = renderTexture.GetSurfaceLevel(0);

d3dimage.SetBackBuffer(D3DResourceType.IDirect3DSurface9, surface.ComPointer);

var rect = System.Windows.Int32Rect(0, 0, width, height);

d3dimage.AddDirtyRect(rect);

d3dimage.Unlock();

これはフレームごとに行う必要があります。

AddDirtyRect に関する追加情報

于 2012-02-02T16:41:07.887 に答える
1

その例で DirectX11 を動作させる方法についてコメントすることはできませんが、あなたが目撃している 5% の CPU は、おそらく DirectX の回転中のレンダリング ループですが、何もする必要はありません。

レンダー ループは、別のスレッドでシーン/物理演算/AI を更新しながら「できるだけ速く」レンダリングするために、ゲームで一般的に使用されます。デスクトップ ビジュアライゼーション アプリケーションでは、これは通常必要ありません。

GUI の更新がユーザーの操作 (アイテムのドラッグ、ビューポートのパンなど) にのみ発生する科学的視覚化アプリケーションの場合、更新がある場合にのみレンダリングするようにレンダリング ループを再設計しました。つまり、mousemove 内でビューポートをパンする作業の後、フラグなどを設定して DirectX に強制的に再描画させます。このように「必要なときに描画」すると、アプリケーションがアイドル状態のときに CPU がほぼゼロになり、デスクトップ アプリケーションにより適しています。

于 2012-02-01T12:14:06.613 に答える