¿Por qué veo que el tiempo transcurrido del juego difiere del tiempo total del juego en XNA?

8

Estaba probando tres formas diferentes de usar ElapsedGameTimey TotalGameTime, porque quiero una coincidencia exacta, por lo que todo se actualiza / dibuja en consecuencia.

Mientras estaba experimentando, aprendí que la primera actualización, ElapsedGameTimey TotalGameTimeambos son 0.

La segunda actualización ElapsedGameTimees 0.0166667, que es correcta (60 actualizaciones por segundo). Pero TotalGameTimees 0, no entiendo por qué.

Entonces, si empiezo a agregar desde la tercera actualización ( time += gameTime.ElapsedTime), ElapsedGameTimees 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);
        }
    }
}
usuario658091
fuente
2
Muy interesante descubrimiento.
cenizas999
Tengo curiosidad sobre cómo estás leyendo estos valores GameTime.TotalGameTime.Milliseconds, o GameTime.TotalGameTime.TotalMilliseconds?
1
Seguí adelante y golpeé a Shawn Hargreaves. Tal vez él pueda responder esto :)
Yo uso TimeSpan.toString ()
user658091
¿Puedes publicar el código que estás utilizando para determinar esto?

Respuestas:

7

Parece un pequeño error, o un comportamiento precisamente correcto, desde el punto en que desea verlo. Verá, el Updatemétodo se llama dos veces antes de la primera llamada Draw, la primera vez que se encuentra fuera del bucle principal del juego.

TotalGameTimese actualiza en el momento entre el final Updatey el comienzo del Draw, dentro del ciclo del juego . ElapsedGameTimePor otro lado, se actualiza después del inicio del bucle principal y antes Update. Ambos se inicializan 0antes de llamar al primero Update.

Si lees la descripción de un ElapsedGameTimees dice:

La cantidad de tiempo transcurrido desde la última actualización .

En el primer cuadro dentro del bucle del juego es una segunda Update llamada. Entonces ElapsedGameTimemuestra el tiempo transcurrido desde la primera Updatellamada.

OTOH, TotalGameTimedice:

La cantidad de tiempo de juego desde el inicio del juego .

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 TotalGameTimeactualiza por primera vez después de la segunda llamada a Update. De ahí la diferencia que observas.

Petr Abdulin
fuente