Saya mencoba tiga cara berbeda untuk menggunakan ElapsedGameTime
dan TotalGameTime
, karena saya ingin kecocokan yang tepat, jadi semuanya diperbarui / digambar sesuai.
Ketika saya bereksperimen, saya belajar bahwa pembaruan pertama, ElapsedGameTime
dan TotalGameTime
keduanya 0.
Pembaruan kedua, ElapsedGameTime
adalah 0,0166667, yang benar (60 pembaruan per detik). Tetapi TotalGameTime
0, saya tidak mengerti mengapa.
Jadi, jika saya mulai menambahkan dari pembaruan ketiga ( time += gameTime.ElapsedTime
), ElapsedGameTime
sama dengan TotalGameTime
, jika tidak akan selalu ada perbedaan 0,0166667.
Bisakah seseorang menjelaskan hal itu kepada saya?
DIPERBARUI: kode
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
, atauGameTime.TotalGameTime.TotalMilliseconds
?Jawaban:
Tampak seperti bug kecil, atau perilaku yang benar-benar tepat, dari titik mana Anda ingin melihatnya. Lihat,
Update
metode ini dipanggil dua kali sebelum panggilanDraw
pertama, pertama kali berada di luar loop permainan utama.TotalGameTime
diperbarui pada saat antara akhirUpdate
dan awalDraw
, di dalam loop game .ElapsedGameTime
di sisi lain diperbarui setelah dimulainya loop utama dan sebelumnyaUpdate
. Keduanya diinisialisasi0
sebelum panggilan ke yang pertamaUpdate
.Jika Anda membaca deskripsi dari
ElapsedGameTime
adalah mengatakan:Pada frame pertama di dalam loop game, itu adalah panggilan kedua
Update
. JadiElapsedGameTime
menunjukkan waktu yang berlalu sejakUpdate
panggilan pertama .OTOH,
TotalGameTime
mengatakan:Ini lebih kabur, tetapi sepertinya game tidak dapat dianggap dimulai, sampai memasuki loop utama dan mulai menggambar itu sendiri. Jadi
TotalGameTime
pembaruan itu sendiri pertama kali setelah panggilan kedua keUpdate
. Oleh karena itu perbedaan yang Anda amati.sumber