Я пробовал три разных способа использования ElapsedGameTime
и TotalGameTime
, потому что я хочу точное совпадение, чтобы все обновлялось / отрисовывалось соответственно.
Пока я экспериментировал, я узнал, что самое первое обновление, ElapsedGameTime
и TotalGameTime
оба 0.
Второе обновление ElapsedGameTime
- 0,0166667, что правильно (60 обновлений в секунду). Но TotalGameTime
это 0, я не понимаю, почему.
Итак, если я начну добавлять из третьего update ( 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);
}
}
}
GameTime.TotalGameTime.Milliseconds
, илиGameTime.TotalGameTime.TotalMilliseconds
?Ответы:
Выглядит как небольшая ошибка или точно правильное поведение, с которой вы хотите на это посмотреть. Видите,
Update
метод вызывается дважды перед первым вызовомDraw
, в первый раз находясь вне основного игрового цикла.TotalGameTime
обновляется в момент между концомUpdate
и началомDraw
, внутри игрового цикла .ElapsedGameTime
с другой стороны, обновляется после запуска основного цикла и доUpdate
. Оба они инициализируются0
перед вызовом первогоUpdate
.Если вы читаете описание, это
ElapsedGameTime
говорит:На первом кадре внутри игрового цикла это второй
Update
вызов. ТакElapsedGameTime
показывает время, прошедшее с первогоUpdate
звонка.ОТО,
TotalGameTime
говорит:Это более расплывчато, но похоже, что игру нельзя считать начатой, пока она не войдет в основной цикл и не начнет рисовать сама. Таким образом
TotalGameTime
обновляется первый раз после второго звонкаUpdate
. Отсюда и разница, которую вы наблюдаете.источник