Estaba probando tres formas diferentes de usar ElapsedGameTime
y TotalGameTime
, porque quiero una coincidencia exacta, por lo que todo se actualiza / dibuja en consecuencia.
Mientras estaba experimentando, aprendí que la primera actualización, ElapsedGameTime
y TotalGameTime
ambos son 0.
La segunda actualización ElapsedGameTime
es 0.0166667, que es correcta (60 actualizaciones por segundo). Pero TotalGameTime
es 0, no entiendo por qué.
Entonces, si empiezo a agregar desde la tercera actualización ( time += gameTime.ElapsedTime
), ElapsedGameTime
es igual a TotalGameTime
, de lo contrario siempre habrá una diferencia de 0.0166667.
¿Puede alguien explicarme eso?
ACTUALIZADO: 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
, oGameTime.TotalGameTime.TotalMilliseconds
?Respuestas:
Parece un pequeño error, o un comportamiento precisamente correcto, desde el punto en que desea verlo. Verá, el
Update
método se llama dos veces antes de la primera llamadaDraw
, la primera vez que se encuentra fuera del bucle principal del juego.TotalGameTime
se actualiza en el momento entre el finalUpdate
y el comienzo delDraw
, dentro del ciclo del juego .ElapsedGameTime
Por otro lado, se actualiza después del inicio del bucle principal y antesUpdate
. Ambos se inicializan0
antes de llamar al primeroUpdate
.Si lees la descripción de un
ElapsedGameTime
es dice:En el primer cuadro dentro del bucle del juego es una segunda
Update
llamada. EntoncesElapsedGameTime
muestra el tiempo transcurrido desde la primeraUpdate
llamada.OTOH,
TotalGameTime
dice:Esto es más vago, pero parece que el juego no puede considerarse iniciado, hasta que ingresó en un bucle principal y comienza a dibujarse. Por lo tanto, se
TotalGameTime
actualiza por primera vez después de la segunda llamada aUpdate
. De ahí la diferencia que observas.fuente