Ich habe drei verschiedene Verwendungsmöglichkeiten ausprobiert ElapsedGameTime
und TotalGameTime
, da ich eine genaue Übereinstimmung möchte, wird alles entsprechend aktualisiert / gezeichnet.
Während ich experimentierte, erfuhr ich, dass das allererste Update ElapsedGameTime
und TotalGameTime
beide 0 sind.
Das zweite Update ElapsedGameTime
ist 0.0166667, was korrekt ist (60 Updates pro Sekunde). Aber TotalGameTime
ist 0, ich verstehe nicht warum.
Wenn ich also ab dem dritten Update ( time += gameTime.ElapsedTime
) anfange hinzuzufügen , ElapsedGameTime
ist 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);
}
}
}
GameTime.TotalGameTime.Milliseconds
, oderGameTime.TotalGameTime.TotalMilliseconds
?Antworten:
Sieht aus wie ein kleiner Fehler oder ein genau korrektes Verhalten, von dem aus Sie es betrachten möchten. Die
Update
Methode wird vor dem ersten Aufruf von zweimal aufgerufen, wobei sie sich zumDraw
ersten Mal außerhalb einer Hauptspielschleife befindet.TotalGameTime
wird in dem Moment zwischen Ende des aktualisiertUpdate
und Beginn derDraw
, in der Spielschleife .ElapsedGameTime
Auf der anderen Seite wird nach dem Start der Hauptschleife und vorher aktualisiertUpdate
. Beide werden0
vor dem Aufruf des ersten initialisiertUpdate
.Wenn Sie die Beschreibung von a lesen,
ElapsedGameTime
heißt es:Im ersten Frame innerhalb der Spielschleife handelt es sich um einen zweiten
Update
Aufruf. SoElapsedGameTime
zeigt die verstrichene Zeit seit dem erstenUpdate
Anruf.OTOH,
TotalGameTime
sagt: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
TotalGameTime
aktualisiert sich das erste Mal nach dem zweiten Aufruf anUpdate
. Daher der Unterschied, den Sie beobachten.quelle