Perché vedo che il tempo di gioco trascorso è diverso dal tempo di gioco totale in XNA?


8

Stavo provando tre modi diversi di usare ElapsedGameTimee TotalGameTime, perché voglio una corrispondenza esatta, quindi tutto viene aggiornato / disegnato di conseguenza.

Mentre stavo sperimentando, ho imparato che il primo aggiornamento, ElapsedGameTimee TotalGameTimesono entrambi 0.

Il secondo aggiornamento ElapsedGameTimeè 0,0166667, che è corretto (60 aggiornamenti al secondo). Ma TotalGameTimeè 0, non capisco perché.

Quindi, se comincio ad aggiungere dal terzo aggiornamento ( time += gameTime.ElapsedTime), ElapsedGameTimeè uguale a TotalGameTime, altrimenti ci sarà sempre una differenza di 0,0166667.

Qualcuno può spiegarmi questo?

AGGIORNATO: codice

    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);
        }
    }
}

2
Scoperta molto interessante.
ashes999,

Sono curioso di sapere come stai leggendo questi valori GameTime.TotalGameTime.Millisecondso GameTime.TotalGameTime.TotalMilliseconds?

1
Sono andato avanti e ho telefonato a Shawn Hargreaves. Forse può rispondere a questo :)

Uso TimeSpan.toString ()
user658091

puoi pubblicare il codice che stai utilizzando per determinarlo?

Risposte:


7

Sembra un piccolo bug, o un comportamento esattamente corretto, da quale punto vuoi guardarlo. Vedi, il Updatemetodo viene chiamato due volte prima della prima chiamata Draw, la prima volta al di fuori di un ciclo di gioco principale.

TotalGameTimeviene aggiornato nel momento tra la fine Updatee l'inizio del Draw, all'interno del ciclo di gioco . ElapsedGameTimed'altra parte viene aggiornato dopo l'inizio del ciclo principale e prima Update. Entrambi sono inizializzati su 0prima di chiamare il primo Update.

Se leggi la descrizione di a ElapsedGameTimedice:

La quantità di tempo di gioco trascorso dall'ultimo aggiornamento .

Al primo fotogramma all'interno del loop di gioco è una seconda Update chiamata. Quindi ElapsedGameTimemostra il tempo trascorso dalla prima Updatechiamata.

OTOH, TotalGameTimeafferma:

La quantità di tempo di gioco dall'inizio del gioco .

Questo è più vago, ma sembra che il gioco non possa essere considerato avviato, fino a quando non entra in un ciclo principale e inizia a disegnare da solo. Quindi si TotalGameTimeaggiorna per la prima volta dopo la seconda chiamata a Update. Da qui la differenza che osservi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.