我想从非托管C ++代码中使用DirectX 11,并使用WFP作为GUI。 SlimDX不适合我。 我找到了使用DirectX 10制作WPF的解决方案:
但我无法使用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/
答案 0 :(得分:3)
我使用了错误的格式来处理顶点缓冲区布局。我使用了DXGI_FORMAT_B8G8R8A8_UNORM,但在我的情况下必须使用DXGI_FORMAT_R32G32B32_FLOAT。
答案 1 :(得分: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();
这需要在每一帧完成。
答案 2 :(得分:1)
我无法评论如何使DirectX11与该示例一起工作,但您正在见证的5%CPU可能是DirectX旋转中的渲染循环,但没有工作要做。
渲染循环通常用于游戏中,以便在更新不同线程上的场景/物理/ AI时“尽可能快地”渲染。在桌面可视化应用程序中,通常不需要。
对于仅在用户交互时发生GUI更新的科学可视化应用程序(例如拖动项目,平移视口)我重新设计了渲染循环,仅在有更新时进行渲染。即:在你的工作之后在mousemove中平移视口,你可以通过设置一个标志或类似的东西强制DirectX重新绘制。这种方式“在需要时绘图”会在应用程序空闲时将CPU降低到接近零,并且更适合桌面应用程序。