2012-02-16 30 views
2

我有一個使用HwndHost顯示DirectX 9內容的WPF應用程序。我試圖使用PIX用於Windows圖形分析器(它與DirectX SDK捆綁在一起)以查看此DirectX窗口中的渲染狀態和調試着色器。使用PIX和WPF應用程序

我遇到的問題是,當我嘗試通過在PIX中按F12進行單幀捕獲時,我有時無法獲取整個幀的所有繪製信息。另外,當我嘗試單擊PIX中的一個DrawPrimitive調用時,我收到一條錯誤消息,指出「回放過程中之前成功的調用失敗。」

我認爲這些問題的原因是WPF也使用DirectX來呈現所有的WPF小部件。它在WPF呈現線程上執行此操作,該操作對WPF中的用戶隱藏。看起來PIX使用對IDirect3DDevice9 :: Present的調用來確定幀何時結束。 WPF呈現線程正在調用IDirect3DDevice9 :: Present在渲染幀的中間,導致PIX感到困惑並截斷該幀(以及在嘗試查看DrawPrimitive調用時發生的錯誤)。

下面是關於如何設置我的應用程序的更多信息:我有一個WPF應用程序,並在主窗口中使用HwndHost顯示一些3D內容。在HwndHost :: BuildWindowCore函數中,我使用CreateWindowEx創建了一個窗口,它給了我一個hwnd。然後我使用這個hwnd初始化DirectX 9設備。然後我把這個hwnd返回給HwndHost。我連接到CompositionTarget.Render事件,該事件調用我的非託管渲染函數來繪製場景中的所有內容。

我試過使用D3DImage控件來顯示我的DirectX表面,但我遇到了同樣的問題。

在我看來,解決這個問題的唯一方法是確保在PIX中執行幀捕獲之前,WPF渲染線程已完全完成。這樣,PIX就不會被任何WPF DirectX調用拋出。但是,我沒有看到有什麼方法可以確定WPF已經完成了所有的渲染。有一個好帖子here,解釋瞭如何使用Dispatcher.Invoke函數來確定WPF元素何時完成呈現,但我需要知道何時所有已完成呈現。

我想知道是否有人成功地用自己的DirectX窗口設置了WPF應用程序,並且能夠使PIX正常工作。任何幫助,將不勝感激。

回答

0

你有沒有找到解決這個問題的解決方案?我目前有完全相同的問題... 糟糕的認識,微軟建立在D3DImage使DirectX兼容WPF,然後你無法調試這...

我目前的想法是將程序分成兩部分。我的程序分爲核心和應用程序。第三個程序管理是啓動調試應用程序還是實際應用程序。

調試應用程序初始化一個WinForms窗口(可以調試)。在那裏我可以測試基於DirectX的所有內容。

應用程序初始化程序本身。

但i'm還在做執行,所以我不能肯定說,它的工作原理...

+0

創建您的應用程序與PIX調試的獨立非WPF的版本來解決這個問題的好辦法問題。就像你提到的,表單工作正常,因爲它不是基於DirectX的。對我來說,這與我正在使用的現有代碼庫不是一個選項。 我想出的hacky解決方案是在F12按下時讓更新線程停頓一秒,讓WPF渲染線程完成一切。然後,我使用D3DPERF_BeginEvent/EndEvent執行幀捕獲的代碼中觸發一個PIX事件。 – mdrink 2012-09-13 22:38:00

+0

嗯好吧,所以這是我正在嘗試做的正確的方式... 我將創建第二個項目,這是一個用於DirectX測試的沙箱。 你的「hacky」解決方案聽起來並不壞......確定它不是最好的,但是一個好主意;) – SharpShade 2012-09-17 18:22:22