5

我想从非托管 C++ 代码中使用 DirectX 11,并将 WFP 用于 GUI。SlimDX 不适合我。我找到了使用 DirectX 10 制作 WPF 的解决方案:

WPF 和 DirectX 10 通过 D3DImage

但是我无法使用 DirectX 11 来处理它。只是带有两个按钮的空白屏幕。有谁知道如何使 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 回答