Warum unterscheidet sich die verstrichene Spielzeit von der gesamten Spielzeit in XNA?

8

Ich habe drei verschiedene Verwendungsmöglichkeiten ausprobiert ElapsedGameTimeund TotalGameTime, da ich eine genaue Übereinstimmung möchte, wird alles entsprechend aktualisiert / gezeichnet.

Während ich experimentierte, erfuhr ich, dass das allererste Update ElapsedGameTimeund TotalGameTimebeide 0 sind.

Das zweite Update ElapsedGameTimeist 0.0166667, was korrekt ist (60 Updates pro Sekunde). Aber TotalGameTimeist 0, ich verstehe nicht warum.

Wenn ich also ab dem dritten Update ( time += gameTime.ElapsedTime) anfange hinzuzufügen , ElapsedGameTimeist gleich TotalGameTime, sonst gibt es immer einen Unterschied von 0,0166667.

Kann mir das jemand erklären?

AKTUALISIERT: 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
quelle
2
Sehr interessante Entdeckung.
Asche999
Ich bin gespannt, wie Sie diese Werte lesen GameTime.TotalGameTime.Milliseconds, oder GameTime.TotalGameTime.TotalMilliseconds?
1
Ich ging voran und pingte Shawn Hargreaves. Vielleicht kann er das beantworten :)
Ich benutze TimeSpan.toString ()
user658091
Können Sie den Code veröffentlichen, mit dem Sie dies feststellen?

Antworten:

7

Sieht aus wie ein kleiner Fehler oder ein genau korrektes Verhalten, von dem aus Sie es betrachten möchten. Die UpdateMethode wird vor dem ersten Aufruf von zweimal aufgerufen, wobei sie sich zum Drawersten Mal außerhalb einer Hauptspielschleife befindet.

TotalGameTimewird in dem Moment zwischen Ende des aktualisiert Updateund Beginn der Draw, in der Spielschleife . ElapsedGameTimeAuf der anderen Seite wird nach dem Start der Hauptschleife und vorher aktualisiert Update. Beide werden 0vor dem Aufruf des ersten initialisiert Update.

Wenn Sie die Beschreibung von a lesen,ElapsedGameTime heißt es:

Die seit dem letzten Update verstrichene Spielzeit .

Im ersten Frame innerhalb der Spielschleife handelt es sich um einen zweiten Update Aufruf. So ElapsedGameTimezeigt die verstrichene Zeit seit dem ersten UpdateAnruf.

OTOH, TotalGameTimesagt:

Die Spielzeit seit Spielbeginn .

Dies ist etwas vager, aber es sieht so aus, als ob das Spiel nicht als gestartet betrachtet werden kann, bis es in eine Hauptschleife eingetreten ist und sich selbst zu zeichnen beginnt. Somit TotalGameTimeaktualisiert sich das erste Mal nach dem zweiten Aufruf an Update. Daher der Unterschied, den Sie beobachten.

Petr Abdulin
quelle