为什么我看到游戏时间与XNA总游戏时间有所不同?

我尝试了三种不同的方式来使用ElapsedGameTimeTotalGameTime ,因为我想要一个精确的匹配,所以一切都相应地更新/绘制。

正如我正在试验,我了解到,第一次更新, ElapsedGameTimeTotalGameTime都是0。

第二次更新, ElapsedGameTime是0.0166667,这是正确的(每秒60更新)。 但TotalGameTime是0,我不明白为什么。

因此,如果我从第三次更新( time += gameTime.ElapsedTime )开始添加,则ElapsedGameTime等于TotalGameTime ,否则总会有0.0166667的差异。

有人可以向我解释吗?

更新:代码

  using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Audio; using Microsoft.Xna.Framework.Content; using Microsoft.Xna.Framework.GamerServices; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Input; using Microsoft.Xna.Framework.Media; using System.Diagnostics; namespace TestTime { class TimeTest2 { TimeSpan totalTimeElapsed; TimeSpan frequency = TimeSpan.FromSeconds(5.5f); int times = 0; int timesCheckpoint = 1; public void load() { } public void initialize() { totalTimeElapsed = TimeSpan.Zero; } public void update(GameTime gameTime) { times++; String debug = ""; TimeSpan zero = TimeSpan.Zero; if( times > 2 ) { totalTimeElapsed += gameTime.ElapsedGameTime; } if( totalTimeElapsed != gameTime.TotalGameTime ) { debug += " Diff time:"+times+" ["+totalTimeElapsed.ToString() + " != " + gameTime.TotalGameTime.ToString() + "]"; } TimeSpan checkpoint = TimeSpan.FromSeconds(5.5f*timesCheckpoint); if( gameTime.TotalGameTime >= checkpoint ) { debug += "5.5f MARK "; timesCheckpoint++; } if( !debug.Equals("") ) { addDebug(debug + " -" + gameTime.TotalGameTime.ToString()); addDebug(""); } } public void draw() { } public void addDebug(string str) { Debug.WriteLine(str); } } } 

看起来像一个小错误,或者一个正确的行为,从哪个角度来看,你想看看它。 看到, Update方法在第一次调用Draw之前调用两次 ,第一次在主游戏循环之外。

TotalGameTime在更新结束和Draw开始之间的瞬间Update在游戏循环内部 。 另一方面,在主循环开始之后和Update之前Update ElapsedGameTime 。 在调用第一个Update之前,它们都被初始化为0

如果你阅读一个ElapsedGameTime 的描述是说:

自上次更新以来经过的游戏时间量。

游戏循环中的第一帧是第二次 Update调用。 所以ElapsedGameTime显示自第一次Update呼叫以来的时间。

OTOH, TotalGameTime说:

游戏开始以来的游戏时间量。

这是一个更模糊的,但它看起来像游戏不能被视为开始,直到它进入一个主循环,并开始绘制自己。 因此TotalGameTime第二次调用Update之后首次Update 。 因此,你观察到的差异。