Pourquoi le temps de jeu écoulé diffère-t-il du temps de jeu total dans XNA?

8

J'essayais trois façons différentes d'utiliser ElapsedGameTimeet 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, ElapsedGameTimeet TotalGameTimesont tous les deux 0.

La deuxième mise à jour ElapsedGameTimeest 0,0166667, ce qui est correct (60 mises à jour par seconde). Mais TotalGameTimeest 0, je ne comprends pas pourquoi.

Donc, si je commence à ajouter à partir de la troisième mise à jour ( time += gameTime.ElapsedTime), ElapsedGameTimeest é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);
        }
    }
}
user658091
la source
2
Découverte très intéressante.
ashes999
Je suis curieux de savoir comment vous lisez ces valeurs GameTime.TotalGameTime.Milliseconds, ou GameTime.TotalGameTime.TotalMilliseconds?
1
Je suis allé de l'avant et j'ai cinglé Shawn Hargreaves. Peut-être qu'il peut répondre à cette question :)
J'utilise TimeSpan.toString ()
user658091
pouvez-vous publier le code que vous utilisez pour le déterminer?

Réponses:

7

Ressemble à un petit bug, ou à un comportement précisément correct, à partir de quel point vous voulez le regarder. Voir, la Updateméthode est appelée deux fois avant le premier appel à Draw, la première fois en dehors d'une boucle de jeu principale.

TotalGameTimeest mis à jour entre la fin Updateet le début de la Draw, à l'intérieur de la boucle de jeu . ElapsedGameTimed'autre part est mis à jour après le début de la boucle principale et avant Update. Les deux sont initialisés à 0avant d'appeler le premier Update.

Si vous lisez la description d'un ElapsedGameTimeest dit:

Le temps de jeu écoulé depuis la dernière mise à jour .

À la première image à l'intérieur de la boucle de jeu, c'est un deuxième Update appel. ElapsedGameTimeMontre donc le temps écoulé depuis le premier Updateappel.

OTOH, TotalGameTimedit:

Le temps de jeu depuis le début du jeu .

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 TotalGameTimemet ainsi à jour la première fois après le deuxième appel à Update. D'où la différence que vous observez.

Petr Abdulin
la source