Eu estava tentando três maneiras diferentes de usar ElapsedGameTime
e TotalGameTime
, como quero uma correspondência exata, tudo é atualizado / elaborado de acordo.
Enquanto eu estava experimentando, aprendi que a primeira atualização ElapsedGameTime
e TotalGameTime
ambas são 0.
A segunda atualização ElapsedGameTime
é 0,0166667, que está correta (60 atualizações por segundo). Mas TotalGameTime
é 0, não entendo o porquê.
Portanto, se eu começar a adicionar a partir da terceira atualização ( time += gameTime.ElapsedTime
), ElapsedGameTime
é igual a TotalGameTime
, caso contrário, sempre haverá uma diferença de 0,0166667.
Alguém pode explicar isso para mim?
ATUALIZADO: código
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
, ouGameTime.TotalGameTime.TotalMilliseconds
?Respostas:
Parece um pequeno bug, ou um comportamento precisamente correto, a partir do qual você deseja examiná-lo. Veja, o
Update
método é chamado duas vezes antes da primeira chamadaDraw
, estando fora do ciclo principal do jogo.TotalGameTime
é atualizado no momento entre o finalUpdate
e o início doDraw
, dentro do ciclo do jogo .ElapsedGameTime
por outro lado, é atualizado após o início do loop principal e antesUpdate
. Ambos são inicializados0
antes da chamada para o primeiroUpdate
.Se você ler a descrição de um
ElapsedGameTime
é diz:No primeiro quadro dentro do loop do jogo , é uma segunda
Update
chamada. AssimElapsedGameTime
mostra o tempo decorrido desde a primeiraUpdate
chamada.OTOH,
TotalGameTime
diz:Isso é mais vago, mas parece que o jogo não pode ser considerado iniciado, até que ele entre no loop principal e comece a se desenhar. Assim, se
TotalGameTime
atualiza pela primeira vez após a segunda chamada paraUpdate
. Daí a diferença que você observa.fonte