2010-05-21 73 views
2

我有一個WinForms應用程序,它使用XNA在控件中爲3D模型設置動畫。該應用在數月內一直很好,但最近我開始在動畫中經歷週期性暫停。設置以調查發生了什麼事我已經建立了這些事實:定期GPU性能問題

  1. 它發生在我的機器上只,其他機器工作正常
  2. 刪除一切從我的渲染循環不提高的問題

在2.我沒有實際刪除的一切,我限制了我的循環來設置我的GraphicsDevice上的視口,然後做一個GraphicsDevice.Present。

試圖進一步挖掘我激發了PIX捕獲一些統計數據。兩個PIX運行的屏幕截圖可以查看here (Run6)here (Run14)。 Run6使用我的原始渲染循環,而Run14使用裸露的Present循環。

PIX告訴我,GPU是定期做東西,我認爲這是導致暫停。這可能是什麼原因?或者我該如何去了解GPU究竟在做什麼?

更新:因爲我通常相信我的代碼是完美的(誰在笑?)我從頭開始一個新的XNA項目,看它是否展現出相同的行爲。因此,啓動一個新的XNA 3.1 Windows遊戲項目並運行PIX我得到this timeline。相同的週期性暫停。所以在XNA或Direct3D中堆棧中的問題必須降低。

因此,PIX顯示GPU正在處理某些事情,我可以看到每個幀內DX調用的列表,計時計算顯示暫停發生在IDirect3DDevice9::Present調用期間(或之後)。

更新2:我以前曾在有問題的機器上安裝和卸載過XNA 4.0 CTP。我不能確定這是相關的,但我認爲重新安裝XNA Game Studio 3.1可能會有所作爲。原來是這樣。

潛在的問題仍然是一樣的(而且賞金仍然存在):可能會影響XNA 3.1(或DirectX)使其表現如何,並且是否存在針對DirectX和/或GPU的任何記錄/追蹤強大工具那裏的水平可以揭示發生了什麼?

注:我在具有8GB RAM的Windows 7 x64雙核計算機上使用XNA 3.1。

注2:也發佈了這個問題在XNA創建者論壇here

回答

1

你可以嘗試看看你是否可以找到Xperf接近你的定期問題的東西,不要運行你的應用程序,但保持程序打開除了應用程序之外,它通常會運行。您也可以嘗試在應用程序運行時再次執行此操作,但可能會產生混亂的視圖。

  1. 開始追蹤,在提示提示下執行此操作。

    xperf -on BASE +潛伏期-stackWalk簡介

  2. 等待了相當數量的時間,以確保該問題跟蹤。

  3. 停止跟蹤並打開它像這樣。

    xperf -d trace.etl
    xperfview trace.etl

  4. 通過觀察圖表和諮詢具體的間隔表的分析,看看你是否能找到的東西,是關係到問題,找到它的最高機會將在DPC和中斷部分。但是在CPU或I/O部分也可能有些奇怪。祝你好運!

關於Xperf and how to obtain it的更多信息,希望能夠提供結果。


如果沒有,則可以選擇嘗試GPUView已用於改善DWM,
這也包含旁邊Xperf與Windows性能工具包讓您可以輕鬆嘗試兩個!

日誌v

...等待了相當數量的時間,以確保該問題被跟蹤......

日誌

gpuview merged.etl

在gpuview內存不足的情況下,您可以嘗試添加「/ limit 3」或刪除v。

如果卡住某處,請閱讀工具的文檔。

+0

+1 yay爲xperf工具!這非常有用! – 2010-05-28 15:29:10

1

嗯...這似乎是發生在GPU上,但它聽起來像一個CPU垃圾收集問題。你可以運行CLR profiler,看看你是否可以看到GC活動的任何峯值,你可以關聯到減速?

我同意這聽起來不太可能,因爲您可以在PIX中清楚地看到它,但它可能提供了原因的線索。

+0

同意GC是一個可能性,我做了一些測試,但他們沒有發現可疑的行爲。另外,裸露的循環實際上並沒有什麼實質性的東西,只有一個用於本次調用的矩形...... – 2010-05-21 23:40:58

0

如果它只發生在你自己的機器上,那麼它可能是驅動程序?原諒我的懷疑態度,但它畢竟是一個64位機器:D

+0

XNA FX和Direct3D在Windows 7 x64上運行良好 - 至少使用ATI GPU(我假設NVIDIA相同)。 – 2010-05-25 22:37:10

+0

如前所述,渲染在相同的驅動程序上工作正常,這就是爲什麼我現在傾向於責備XNA 4.0 CTP。但是,是的,我安裝了一個更新的gfx驅動程序,但沒有解決問題。 – 2010-05-26 06:28:59

0

這看起來像是vsync問題還是GPU在最後的陣痛。由於回到不同的版本修復了它,並且在IDirect3DDevice9::Present中的「瓶頸」讓我們繼續前面的選項。

我對XNA並不熟悉,所以我不知道D3D有多少工作是暴露的,但是您知道您的PresentationParameters設置爲什麼嗎?

具體嘗試將交換效果設置爲放棄。

+0

好吧,最後一次測試中的XNA層非常薄,每幀渲染只包含5個以IDirect3DDevice9 :: Present(NULL,NULL,NULL,NULL)結尾的DX調用。 – 2010-05-28 15:28:18

+0

在互聯網上進行了一次快速檢查以獲取XNA術語,並且它看起來像PresentationParameters作爲GraphicsDevice構造函數的最後一個參數傳入。它看起來並不像你可以在4.0中改變交換效果,即使它在3.1中可用。嘗試將您的PresentParameters上的PresentInterval設置爲Immediate。請參閱http://msdn.microsoft.com/en-us/library/ff433790(v=XNAGameStudio.40).aspx和http://msdn.microsoft.com/en-us/library/microsoft.xna.framework。 graphics.presentinterval(v = XNAGameStudio.40).aspx – 2010-05-28 18:33:56

+0

就像一個參考:交換效果現在是名爲PresentationInterval的PresentationParameters類的成員(請參閱http://msdn.microsoft.com/zh-cn/library/microsoft .xna.framework.graphics.presentationparameters_members(v = XNAGameStudio.40).aspx和http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.graphics.presentinterval(v=XNAGameStudio.40)的.aspx)。 – 2010-05-30 12:13:29