我有一个使用HwndHost显示DirectX 9内容的WPF应用程序。我正在尝试使用 PIX for Windows 图形探查器(与DirectX SDK捆绑在一起)在此DirectX窗口中查看渲染状态和调试着色器。
我遇到的问题是,当我尝试通过在PIX中按F12进行单帧捕获时,我有时无法获得整个帧的所有绘制信息。此外,当我尝试在PIX中单击一个DrawPrimitive调用时,我收到一条错误消息,说“在回放期间之前成功的呼叫失败了。”
我认为这些问题的原因是WPF还使用DirectX来呈现所有WPF小部件。它在WPF渲染线程中执行此操作,该线程在WPF中对用户隐藏。看起来PIX使用对IDirect3DDevice9 :: Present的调用来确定帧何时结束。 WPF渲染线程正在我的渲染帧的中间调用IDirect3DDevice9 :: Present,导致PIX混淆并截断该帧(当我尝试查看DrawPrimitive调用时出错)。
以下是有关我的应用程序设置方式的更多信息:我在主窗口中有一个带有HwndHost的WPF应用程序,用于显示一些3D内容。在HwndHost :: BuildWindowCore函数中,我使用CreateWindowEx创建一个窗口,它给了我一个hwnd。然后我使用这个hwnd初始化DirectX 9设备。然后我将hwnd返回给HwndHost。我连接到CompositionTarget.Render事件,该事件调用我的非托管渲染函数来绘制场景中的所有内容。
我尝试使用D3DImage控件来显示我的DirectX表面,但我遇到了同样的问题。
在我看来,解决此问题的唯一方法是确保在PIX中执行帧捕获之前WPF渲染线程已完全完成。这样,任何WPF DirectX调用都不会抛弃PIX。但是,我没有看到有任何方法可以确定WPF已完成渲染所有内容。有一篇很好的帖子here解释了如何使用Dispatcher.Invoke函数来确定单个 WPF元素何时完成呈现,但我需要知道何时所有内容已完成渲染。
我想知道是否有人使用自己的DirectX窗口成功设置了WPF应用程序,并且能够使PIX正常工作。任何帮助将不胜感激。
答案 0 :(得分:0)
你有没有找到解决这个问题的方法?我目前有完全相同的问题...... 不好意思,微软内置D3DImage使DirectX与WPF兼容,然后你无法调试这个......
我目前的想法是将该计划分为两部分。我的程序分为Core和Application。第三个程序管理是启动调试应用程序还是实际应用程序。
调试应用程序初始化WinForms窗口(可以调试)。我能够测试基于DirectX的所有内容。
应用程序初始化程序本身。
但我仍然在执行,所以我肯定会说它有效......