Почему истекшее игровое время отличается от общего игрового времени в XNA?

8

Я пробовал три разных способа использования ElapsedGameTimeи TotalGameTime, потому что я хочу точное совпадение, чтобы все обновлялось / отрисовывалось соответственно.

Пока я экспериментировал, я узнал, что самое первое обновление, ElapsedGameTimeи TotalGameTimeоба 0.

Второе обновление ElapsedGameTime- 0,0166667, что правильно (60 обновлений в секунду). Но TotalGameTimeэто 0, я не понимаю, почему.

Итак, если я начну добавлять из третьего update ( 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);
        }
    }
}
user658091
источник
2
Очень интересное открытие.
ashes999
Мне интересно, как вы читаете эти значения GameTime.TotalGameTime.Milliseconds, или GameTime.TotalGameTime.TotalMilliseconds?
1
Я пошел дальше и пингнул Шона Харгривза. Может быть, он может ответить на этот вопрос :)
Я использую TimeSpan.toString ()
user658091
Вы можете опубликовать код, который вы используете, чтобы определить это?

Ответы:

7

Выглядит как небольшая ошибка или точно правильное поведение, с которой вы хотите на это посмотреть. Видите, Updateметод вызывается дважды перед первым вызовом Draw, в первый раз находясь вне основного игрового цикла.

TotalGameTimeобновляется в момент между концом Updateи началом Draw, внутри игрового цикла . ElapsedGameTimeс другой стороны, обновляется после запуска основного цикла и до Update. Оба они инициализируются 0перед вызовом первого Update.

Если вы читаете описание, это ElapsedGameTimeговорит:

Количество прошедшего игрового времени с момента последнего обновления .

На первом кадре внутри игрового цикла это второй Update вызов. Так ElapsedGameTimeпоказывает время, прошедшее с первого Updateзвонка.

ОТО, TotalGameTimeговорит:

Количество игрового времени с начала игры .

Это более расплывчато, но похоже, что игру нельзя считать начатой, пока она не войдет в основной цикл и не начнет рисовать сама. Таким образом TotalGameTimeобновляется первый раз после второго звонка Update. Отсюда и разница, которую вы наблюдаете.

Петр Абдулин
источник