2012-10-30 50 views
2

我正在製作XNA遊戲,現在是時候製作白天系統了,爲此我需要某種時鐘。我試圖用GameTime.TotalGameTime.Milliseconds == 0爲我的自定義時鐘類的第二個計數器添加一秒鐘,但事實證明GameTime並不總是在零毫秒內運行。使用TimeSpan prevUpdateTotalGameTime.TotalSeconds進行比較並沒有給出足夠的精度,並且時間明顯比實時慢。如何在XNA中製作精確時鐘?

可以使用什麼XNA或.Net組件來建立我的時鐘,使其不會花費太多資源或明顯偏離實時?

回答

3

使用Stopwatch進行高精度計時(reference)。

使用XNA的GameTime來渲染和幀到幀定時邏輯。 XNA的計時器與「掛鐘」時間完全不符。它能夠漂移以便更好地與幀渲染對齊,從而爲您提供更流暢的動畫(這是由Game類提供的行爲)。隨着時間的推移,它會稍微偏離實時,但對於大多數遊戲來說,這不是問題。

使用DateTime可準確測量較長時間跨度(例如:分鐘,小時)。


注意,你不應該比較Milliseconds == 0,因爲你無法知道什麼時候XNA會打電話給你的Update方法,所以你可以在一幀上有Milliseconds == 999,然後Milliseconds == 15下一個 - 纏繞並跳過過去0 ,所以你的條件永遠不會觸發。

因此,您需要確定計時器何時超過閾值。有很多方法可以做到這一點。您可以跟蹤一個閾值(如果您正在跟蹤某個「總」時間,則有用),並在每次觸發後遞增。我個人更喜歡這樣積累時間:

seconds += gameTime.ElapsedTime.TotalSeconds; 
if(seconds > 1.0) 
{ 
    seconds -= 1.0; 
    DoSomething(); // Triggered each second 
}