2011-04-07 75 views
7

我正在嘗試製作一款類似於應用程序的小遊戲,但它需要足夠的時間來評估遊戲。如何在WPF遊戲中獲取當前時間? (No XNA)

我看到一些java版本使用這種方法調用System.nanoTime

是否有.NET版本?

更重要的是我正在尋找一種可以用來評估世界的計時器。我應該使用實際的計時器控件並訂閱它嗎?

此外,遊戲在與UI線程不同的線程上進行評估。以防萬一,這有所作爲。

回答

4

System.Threading.Timer具有1ms分辨率。如果你需要更高的分辨率,你可以在kernel32.dll中調用QueryPerformanceFrequency()和QueryPerformanceCounter()。

+3

類StopWatch在內部使用QueryPerformanceCounter,不需要p/invoke .. – codymanix 2011-05-16 14:58:14

+0

謝謝科迪,我沒有意識到這一點。 – 2011-05-17 18:14:26

1

那麼,有DateTime.UtcNowDateTime.Now。但是,對於循環進程,您應該使用其中一個計時器類。通常用於wpf的是DispatcherTimer

3

你試過

DateTime.Now; 

這給了你每次調用時的當前時間。你可以在兩個不同的點上得到它,並減去endtime - 時間跨度的startime。

5

DateTime.Now在納秒範圍內沒有實際分辨率。 Tick是100納秒「大塊」時間,但DateTime.Now不能解決每個Tick。我相信DateTime.Now的最低分辨率是10毫秒左右左右。如果您非常快速地撥打DateTime.Now兩次,您會得到相同的答案。你只會在大約10毫秒左右後才能看到它,這取決於你在調用它的週期中的哪個位置。

Stopwatch class有一個更精細的分辨率DateTime.Now。我相信它會解決到毫秒,這應該有足夠的分辨率來確定您的遊戲評估代碼是否表現良好。有一個很好的例子,可以在提供的鏈接上對比Stopwatch和DateTime。

此外,Frequency字段和GetTimestamp方法可用於替代非託管Win32 API QueryPerformanceFrequency和QueryPerformanceCounter。

+0

秒錶類實際上將使用QueryPerformanceCounter(如果可用)(請參閱IsHighResolution字段)。所以通常不需要手動使用Frequency字段和GetTimestamp方法。 – ollb 2011-04-07 20:44:07

+0

@Gnafoo - 這正是我想表達的。消息的意圖是,你不需要(不會看到好處)在kernal32.dll上使用P/Invoke。感謝您的澄清。 – 2011-04-07 20:55:25

+0

@Joan Venge - 您需要開始標記回答問題或者人們將不再回答。我認爲現在有幾個出色的權利。 – 2011-04-07 21:48:49

1

使用StopWatch類,它在內部使用QueryPerformanceCounter,因此您有非常好的分辨率。這樣你就不需要進行pinvoke/interop了。