使用D3DImage实现WPF和DirectX 11共存

5
我希望从非托管C++代码中使用DirectX 11,并使用WFP进行GUI。 SlimDX不适合我。 我已经找到了一种解决方案,可以让WPF与DirectX 10一起工作:通过D3DImage处理的WPF和DirectX 10。 但我无法让它与DirectX 11一起工作。只有两个按钮的白屏。 是否有人知道如何使WPF与DirectX 11一起工作? 我也发现,当我仅运行此示例时,Intel i5 750(Windows 7 64位,NVidia Geforce 430)的CPU使用率约为4-5%。我认为这太多了。是否可能降低CPU使用率? 您可以在这里找到我的代码。

你有收到任何错误信息吗?你能贴出你的设置和渲染代码吗? - Patrick Lafferty
你可以在这里找到我的代码:http://www.gamedev.net/topic/619534-wpf-directx-11-via-d3dimage/ - Alex
3个回答

3

我在顶点缓冲区布局中使用了错误的格式。我使用了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();

这需要在每个帧中完成。

关于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。 - Alex

1

我无法评论如何使DirectX11与该示例配合工作,但您所见到的5% CPU 可能是DirectX中的渲染循环在旋转,但没有任务要执行。

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

对于科学可视化应用程序,在用户交互(例如拖动项目,平移视口)时才会更新GUI,我已重新设计了渲染循环,仅在有更新时才进行渲染。即:在mousemove中平移视口后,通过设置标志或类似方式强制DirectX重新绘制。这样,“需要时绘制”将使CPU几乎降至零,而应用程序处于空闲状态,并且更适用于桌面应用程序。


是的,你说得对。现在WPF每秒重绘约为60帧。我只能通过通知来重新绘制。但如果GUI比两个按钮更复杂,即使仅在需要时重新绘制,CPU使用率也会增加到10-15%。 - Alex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接