Por que estou vendo o tempo decorrido do jogo diferir do tempo total do jogo no XNA?

8

Eu estava tentando três maneiras diferentes de usar ElapsedGameTimee TotalGameTime, como quero uma correspondência exata, tudo é atualizado / elaborado de acordo.

Enquanto eu estava experimentando, aprendi que a primeira atualização ElapsedGameTimee TotalGameTimeambas 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);
        }
    }
}
user658091
fonte
2
Descoberta muito interessante.
precisa
Estou curioso para saber como você está lendo esses valores GameTime.TotalGameTime.Milliseconds, ou GameTime.TotalGameTime.TotalMilliseconds?
11
Fui em frente e pinguei Shawn Hargreaves. Talvez ele possa responder a esta :)
Eu uso TimeSpan.toString ()
user658091
você pode postar o código que está usando para determinar isso?

Respostas:

7

Parece um pequeno bug, ou um comportamento precisamente correto, a partir do qual você deseja examiná-lo. Veja, o Updatemétodo é chamado duas vezes antes da primeira chamada Draw, estando fora do ciclo principal do jogo.

TotalGameTimeé atualizado no momento entre o final Updatee o início do Draw, dentro do ciclo do jogo . ElapsedGameTimepor outro lado, é atualizado após o início do loop principal e antes Update. Ambos são inicializados 0antes da chamada para o primeiro Update.

Se você ler a descrição de um ElapsedGameTimeé diz:

A quantidade de tempo decorrido do jogo desde a última atualização .

No primeiro quadro dentro do loop do jogo , é uma segunda Update chamada. Assim ElapsedGameTimemostra o tempo decorrido desde a primeira Updatechamada.

OTOH, TotalGameTimediz:

A quantidade de tempo do jogo desde o início do jogo .

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 TotalGameTimeatualiza pela primeira vez após a segunda chamada para Update. Daí a diferença que você observa.

Petr Abdulin
fonte