ゲームの経過時間がXNAの合計ゲーム時間と異なるのはなぜですか?


8

私が使用しての3つの異なる方法をしようとしていたElapsedGameTimeし、TotalGameTimeそれに応じて描かれた/、私は完全に一致したいので、そのすべてが更新されます。

私が試したので、私は非常に最初の更新ということを学んだ、ElapsedGameTimeTotalGameTimeの両方0です。

2番目の更新ElapsedGameTimeは0.0166667で、これは正しい(毎秒60回の更新)です。しかしTotalGameTime、0です。理由はわかりません。

したがって、3回目の更新(time += gameTime.ElapsedTime)から追加を開始した場合、ElapsedGameTimeはに等しくなりますTotalGameTime。それ以外の場合は、常に0.0166667の差があります。

誰かが私にそれを説明できますか?

更新:コード

    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
非常に興味深い発見。
ashes999

あなたがこれらの値をどのように読んでいるかについて私は興味がありますGameTime.TotalGameTime.MillisecondsGameTime.TotalGameTime.TotalMilliseconds

1
私は先に進み、Shawn Hargreavesにpingを送信しました。多分彼はこれに答えることができます:)

私はTimeSpan.toString()を使用
user658091

これを決定するために使用しているコードを投稿できますか?

回答:


7

小さなバグ、または正確に正しい動作のように見えます。その時点から、それを確認します。このUpdateメソッドは、への最初の呼び出しの前に2回呼び出されDrawます。最初はメインゲームループの外側です。

TotalGameTime端部との間に瞬間的に更新されてUpdateの開始Drawゲームループの内側ElapsedGameTime一方、メインループの開始後かつの前に更新されUpdateます。どちらも0最初のを呼び出す前に初期化されUpdateます。

あなたがいる場合の説明を読んElapsedGameTimeいると言います。

最後の更新以降のゲーム経過時間。

ゲームループ内の最初のフレームでは、2番目の Update呼び出しです。したがってElapsedGameTime、最初のUpdate呼び出しからの経過時間が表示されます。

OTOHさんのコメントTotalGameTime

ゲーム開始からのゲーム時間。

これはもっとあいまいですが、メインループに入り、自分自身で描画を開始するまで、ゲームは開始されたと見なすことができないようです。したがってTotalGameTime、への2回目の呼び出しの後、最初に自身を更新しますUpdate。したがって、あなたが観察する違い。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.