【问题标题】:WPF and DirectX 11 via D3DImageWPF 和 DirectX 11 通过 D3DImage
【发布时间】:2012-02-03 01:09:31
【问题描述】:

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

WPF & DirectX 10 via 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/

【问题讨论】:

标签: c++ wpf directx directx-11


【解决方案1】:

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

【讨论】:

    【解决方案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();
    

    这需要在每一帧中完成。

    Additional info about AddDirtyRect

    【讨论】:

    • 不,我在 Window1.xaml.cs 文件中执行此操作。我发现了我的错误。我对布局使用了错误的格式 { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 }。我使用了 DXGI_FORMAT_B8G8R8A8_UNORM,但必须:DXGI_FORMAT_R32G32B32_FLOAT
    【解决方案3】:

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

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

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

    【讨论】:

    • 是的,你是对的。现在 WPF 重绘 ~60 fps。我只能通过通知重绘。但是如果 GUI 比两个按钮更复杂,那么 CPU 使用率会增加 10-15 %,即使只在需要时重绘也是如此。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-08
    • 1970-01-01
    • 2010-12-27
    相关资源
    最近更新 更多