2012-07-27 47 views
1

我在使用C#編寫和使用Visual Studio 2010 express時XNA 4.0中的時序問題。XNA 4.0遊戲類每秒能更新60次以上嗎?

我不是完全寫一個遊戲,但我正在嘗試使用XNA來簡化內容管道,繪圖和計時。我想要做的是編寫一個程序,可以在非常精細的分辨率下計算用戶對屏幕刺激的響應 - 理想情況下小於5毫秒。

要做到這一點,我需要調用更新例程(這樣我可以輪詢鍵盤)不少於每5毫秒一次。即使在變步時序中,我也無法獲得低於每次通話約16毫秒的時序。這似乎與我在更新和繪製例程中所做的處理量沒有任何關係。我可以評論兩個例程中的所有內容,並且程序在每次迭代中仍然花費大約16.66毫秒。

在固定步長時序中,我可以將目標設置爲每秒約60次迭代(更新間爲16.66 ms),但如果我嘗試以比這更快的速度行進,則IsRunningSlowly標誌會跳閘,遊戲似乎嘗試以補償 - 幾次迭代將以每秒60次迭代的速度運行,然後1次迭代將運行得更慢。

所以我想我的問題是這樣的:每秒60次迭代XNA的上限?是否有可能規避它?我應該完全拋棄XNA嗎?

我真的很感謝你的時間和知識。提前致謝。

+0

你能指定你的平臺嗎? Windows,Windows Phone,Xbox 360? – 2012-07-27 09:46:36

+0

對不起,目標平臺是Windows。 – user1556350 2012-07-28 02:14:21

回答

-1

我並不是XNA開發專家,但是,我知道我在windows phone中已經有類似的「問題」了。 (慢慢問題)。

當你有很多的治療,用multithreading programming,

MSDN:「使用多線程能更好地響應用戶的輸入,因爲用戶界面保持活躍的處理器密集型任務的單獨的線程上執行應用程序的多線程是也有用的,當你創建可擴展的應用程序,因爲你可以添加作爲線程工作負載的增加。「

希望我幫你......

+0

多線程這是一個好主意。我會研究它!謝謝。 – user1556350 2012-07-27 12:25:44

+0

歡迎您!一般來說,當我們有很多治療方法時,這是解決方案:p – 2012-07-27 12:28:27

2

您所遇到的問題是由於垂直同步。通過加入這一行到您的遊戲的構造器來關閉它在XNA(假設你有默認​​):

graphics.SynchronizeWithVerticalRetrace = false; 

這將使您的遊戲「越快越好」運行。這應該是「足夠好」爲您的目的。

請參閱this blog post瞭解XNA中的時序說明。

如果您想獲得更多的樂趣:對於Windows上的XNA,我會考慮直接使用Windows事件循環和高分辨率計時器。請注意,XNA中的Game(在Windows和Xbox 360上)完全是可選的。

您希望將主線程中的許多慢操作(例如:更新和繪製)和阻止操作(例如:vsync)移動到其他位置。請注意,XNA中的輸入只能在主線程中處理。我認爲你可以在一個單獨的線程上創建圖形設備 - 儘管我從來沒有嘗試過。

您應該注意到,如果您正在測量反應時間,則向GPU發送「當前」命令與實際出現在屏幕上的內容之間存在滯後。

+0

謝謝!這有很多幫助。不知道我在研究中如何錯過博客。禁用VSync似乎解決了眼前的問題,但我會嘗試根據您的建議將渲染和更新置於另一個線程中。有什麼方法可以衡量發送當前命令和實際演示文稿之間的差距嗎?如果是這樣,我可以簡單地減去參與者響應時間的滯後。 – user1556350 2012-07-27 12:22:28

+0

不是,因爲也有硬件滯後。你可以測量一些流水線上的延遲 - 也許一切直到GPU將其輸出發送到顯示器 - 但這超出了我的專業領域。 – 2012-07-27 12:29:37

+0

感謝您的提示,無論如何。我會研究這個。 – user1556350 2012-07-28 02:14:54