J'essayais trois façons différentes d'utiliser ElapsedGameTime
et TotalGameTime
, parce que je veux une correspondance exacte, tout est mis à jour / dessiné en conséquence.
Pendant que j'expérimentais, j'ai appris que la toute première mise à jour, ElapsedGameTime
et TotalGameTime
sont tous les deux 0.
La deuxième mise à jour ElapsedGameTime
est 0,0166667, ce qui est correct (60 mises à jour par seconde). Mais TotalGameTime
est 0, je ne comprends pas pourquoi.
Donc, si je commence à ajouter à partir de la troisième mise à jour ( time += gameTime.ElapsedTime
), ElapsedGameTime
est égal à TotalGameTime
, sinon il y aura toujours une différence de 0,0166667.
Quelqu'un peut-il m'expliquer cela?
MISE À JOUR: code
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
?Réponses:
Ressemble à un petit bug, ou à un comportement précisément correct, à partir de quel point vous voulez le regarder. Voir, la
Update
méthode est appelée deux fois avant le premier appel àDraw
, la première fois en dehors d'une boucle de jeu principale.TotalGameTime
est mis à jour entre la finUpdate
et le début de laDraw
, à l'intérieur de la boucle de jeu .ElapsedGameTime
d'autre part est mis à jour après le début de la boucle principale et avantUpdate
. Les deux sont initialisés à0
avant d'appeler le premierUpdate
.Si vous lisez la description d'un
ElapsedGameTime
est dit:À la première image à l'intérieur de la boucle de jeu, c'est un deuxième
Update
appel.ElapsedGameTime
Montre donc le temps écoulé depuis le premierUpdate
appel.OTOH,
TotalGameTime
dit:C'est plus vague, mais il semble que le jeu ne puisse pas être considéré comme démarré, jusqu'à ce qu'il entre dans une boucle principale et commence à se dessiner. Se
TotalGameTime
met ainsi à jour la première fois après le deuxième appel àUpdate
. D'où la différence que vous observez.la source