Mengapa saya melihat waktu permainan yang berlalu berbeda dari total waktu permainan di XNA?

8

Saya mencoba tiga cara berbeda untuk menggunakan ElapsedGameTimedan TotalGameTime, karena saya ingin kecocokan yang tepat, jadi semuanya diperbarui / digambar sesuai.

Ketika saya bereksperimen, saya belajar bahwa pembaruan pertama, ElapsedGameTimedan TotalGameTimekeduanya 0.

Pembaruan kedua, ElapsedGameTimeadalah 0,0166667, yang benar (60 pembaruan per detik). Tetapi TotalGameTime0, saya tidak mengerti mengapa.

Jadi, jika saya mulai menambahkan dari pembaruan ketiga ( time += gameTime.ElapsedTime), ElapsedGameTimesama 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);
        }
    }
}
pengguna658091
sumber
2
Penemuan yang sangat menarik.
ashes999
Saya ingin tahu bagaimana Anda membaca nilai-nilai ini GameTime.TotalGameTime.Milliseconds, atau GameTime.TotalGameTime.TotalMilliseconds?
1
Saya pergi ke depan dan melakukan ping ke Shawn Hargreaves. Mungkin dia bisa menjawab ini :)
Saya menggunakan TimeSpan.toString ()
user658091
dapatkah Anda memposting kode yang Anda gunakan untuk menentukan ini?

Jawaban:

7

Tampak seperti bug kecil, atau perilaku yang benar-benar tepat, dari titik mana Anda ingin melihatnya. Lihat, Updatemetode ini dipanggil dua kali sebelum panggilan Drawpertama, pertama kali berada di luar loop permainan utama.

TotalGameTimediperbarui pada saat antara akhir Updatedan awal Draw, di dalam loop game . ElapsedGameTimedi sisi lain diperbarui setelah dimulainya loop utama dan sebelumnya Update. Keduanya diinisialisasi 0sebelum panggilan ke yang pertama Update.

Jika Anda membaca deskripsi dari ElapsedGameTimeadalah mengatakan:

Jumlah waktu permainan yang berlalu sejak pembaruan terakhir .

Pada frame pertama di dalam loop game, itu adalah panggilan kedua Update . Jadi ElapsedGameTimemenunjukkan waktu yang berlalu sejak Updatepanggilan pertama .

OTOH, TotalGameTimemengatakan:

Jumlah waktu permainan sejak awal permainan .

Ini lebih kabur, tetapi sepertinya game tidak dapat dianggap dimulai, sampai memasuki loop utama dan mulai menggambar itu sendiri. Jadi TotalGameTimepembaruan itu sendiri pertama kali setelah panggilan kedua ke Update. Oleh karena itu perbedaan yang Anda amati.

Petr Abdulin
sumber