WPF and DirectX 11 via D3DImage



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

WPF&DirectX 10通过D3DImage

但我没能用DirectX 11来处理它。只有两个按钮的空白屏幕。有人知道如何使WPF与DirectX 11协同工作吗。

我还看到,当我刚刚运行这个例子时,英特尔i5 750(Windows 7 64位,NVidia Geforce 430)的CPU使用率约为4-5%。我觉得太过分了。。有可能减少CPU使用量吗?

你可以在这里找到我的代码:http://www.gamedev.net/topic/619534-wpf-directx-11-via-d3dimage/

我对顶点缓冲区布局使用了错误的格式。我使用了DXGI_FORMAT_B8G8R8A8_UNORM,但在我的情况下必须使用DXGI_FFORMAT_R32B32_FLOAT。

您缺少对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 的其他信息

我无法评论如何使DirectX11与该示例一起工作,但您看到的5%CPU可能是DirectX旋转中的渲染循环,但没有工作要做。

渲染循环通常在游戏中用于"尽可能快地"渲染,同时在不同的线程上更新场景/物理/AI。在桌面可视化应用程序中,这通常是不必要的。

对于科学可视化应用程序,其中GUI的更新仅在用户交互时发生(例如,拖动项目、平移视口),我重新设计了渲染循环,使其仅在有更新时进行渲染。即:在鼠标移动中平移视口后,您可以通过设置标志或类似方式强制DirectX重新绘制。这种"在需要时绘图"的方式将在应用程序空闲时将CPU减少到接近零,更适合桌面应用程序。

最新更新