也許我只是一個白癡,但我一直試圖實現一個遊戲循環整天,它只是不點擊。我從字面上閱讀了我在Google上可以找到的每篇文章,但問題是它們都使用不同的計時機制,這使得它們很難應用於我的特定情況(一些使用毫秒,其他使用刻度等)。遊戲循環和時間跟蹤
基本上,我有一個Clock
對象,每次執行遊戲循環時都會更新。
internal class Clock {
public static long Timestamp {
get { return Stopwatch.GetTimestamp(); }
}
public static long Frequency {
get { return Stopwatch.Frequency; }
}
private long _startTime;
private long _lastTime;
private TimeSpan _totalTime;
private TimeSpan _elapsedTime;
/// <summary>
/// The amount of time that has passed since the first step.
/// </summary>
public TimeSpan TotalTime {
get { return _totalTime; }
}
/// <summary>
/// The amount of time that has passed since the last step.
/// </summary>
public TimeSpan ElapsedTime {
get { return _elapsedTime; }
}
public Clock() {
Reset();
}
public void Reset() {
_startTime = Timestamp;
_lastTime = 0;
_totalTime = TimeSpan.Zero;
_elapsedTime = TimeSpan.Zero;
}
public void Tick() {
long currentTime = Timestamp;
if (_lastTime == 0)
_lastTime = currentTime;
_totalTime = TimestampToTimeSpan(currentTime - _startTime);
_elapsedTime = TimestampToTimeSpan(currentTime - _lastTime);
_lastTime = currentTime;
}
public static TimeSpan TimestampToTimeSpan(long timestamp) {
return TimeSpan.FromTicks(
(timestamp * TimeSpan.TicksPerSecond)/Frequency);
}
}
我基於XNA的大部分GameClock
,但它大大簡化。然後,我有一個Time
類,它擁有Update
和Draw
方法需要知道的各種時間。
public class Time {
public TimeSpan ElapsedVirtualTime { get; internal set; }
public TimeSpan ElapsedRealTime { get; internal set; }
public TimeSpan TotalVirtualTime { get; internal set; }
public TimeSpan TotalRealTime { get; internal set; }
internal Time() { }
internal Time(TimeSpan elapsedVirtualTime, TimeSpan elapsedRealTime,
TimeSpan totalVirutalTime, TimeSpan totalRealTime) {
ElapsedVirtualTime = elapsedVirtualTime;
ElapsedRealTime = elapsedRealTime;
TotalVirtualTime = totalVirutalTime;
TotalRealTime = totalRealTime;
}
}
我的主類保存了Time
一個實例,它應該在遊戲循環過程中不斷更新。到目前爲止,我有這個:
private static void Loop() {
do {
Clock.Tick();
Time.TotalRealTime = Clock.TotalTime;
Time.ElapsedRealTime = Clock.ElapsedTime;
InternalUpdate(Time);
InternalDraw(Time);
} while (!_exitRequested);
}
時間類的實時屬性變得很好。現在我想得到一個適當的更新/繪製循環,以便狀態每幀更新一次可變的次數,但是在固定的時間步長。同時,Time.TotalVirtualTime
和Time.ElapsedVirtualTime
應該相應地更新。另外,我打算在未來支持多人遊戲,以防對遊戲循環的設計產生影響。
有關如何實現此操作的任何提示或示例(除了指向文章的鏈接)?
對不起,我忘了提及我只關心在Xbox 360上運行,這意味着我將無法訪問P/Invoke,並且我不需要擔心繫統何時需要繪製,因爲我可以隨時畫畫。 'Clock'類已經通過使用'Stopwatch.GetTimestamp()'準確計時。我的問題是關於如何構建固定更新循環以及如何跟蹤流逝的「遊戲/虛擬時間」。我認爲我有一個相當好的理解,但我希望有一些建議,以防萬一有更好的方法來做到這一點。不過謝謝你的回答! – 2010-04-04 14:50:02