Tại sao tôi thấy thời gian trò chơi trôi qua khác với tổng thời gian trò chơi trong XNA?


8

Tôi đã thử ba cách sử dụng khác nhau ElapsedGameTimeTotalGameTimevì tôi muốn một kết hợp chính xác, vì vậy mọi thứ đều được cập nhật / rút ra tương ứng.

Khi tôi đang thử nghiệm, tôi đã biết rằng bản cập nhật đầu tiên ElapsedGameTimeTotalGameTimeđều là 0.

Cập nhật thứ hai, ElapsedGameTimelà 0,0166667, đúng (60 cập nhật mỗi giây). Nhưng TotalGameTimelà 0, tôi không hiểu tại sao.

Vì vậy, nếu tôi bắt đầu thêm từ bản cập nhật thứ ba ( time += gameTime.ElapsedTime), ElapsedGameTimebằng TotalGameTime, nếu không sẽ luôn có chênh lệch 0,0166667.

Ai đó có thể giải thích điều đó với tôi?

CẬP NHẬT: mã

    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
Khám phá rất thú vị.
tro999

Tôi tò mò về cách bạn đang đọc những giá trị này GameTime.TotalGameTime.Milliseconds, hay GameTime.TotalGameTime.TotalMilliseconds?

1
Tôi đã đi trước và ping Shawn Hargreaves. Có lẽ anh ta có thể trả lời điều này :)

Tôi sử dụng TimeSpan.toString ()
user658091

bạn có thể gửi mã bạn đang sử dụng để xác định điều này?

Câu trả lời:


7

Trông giống như một lỗi nhỏ, hoặc một hành vi chính xác chính xác, từ điểm mà bạn muốn xem xét nó. Xem, Updatephương thức được gọi hai lần trước khi gọi Drawlần đầu tiên, lần đầu tiên nằm ngoài vòng lặp trò chơi chính.

TotalGameTimeđược cập nhật trong thời điểm giữa kết thúc Updatevà bắt đầu của Draw, bên trong vòng lặp trò chơi . ElapsedGameTimemặt khác được cập nhật sau khi bắt đầu vòng lặp chính và trước đó Update. Cả hai đều được khởi tạo 0trước khi gọi đến đầu tiên Update.

Nếu bạn đọc mô tả của a ElapsedGameTimethì nói:

Lượng thời gian trò chơi đã trôi qua kể từ lần cập nhật cuối cùng .

Ở khung đầu tiên bên trong vòng lặp trò chơi, đó là cuộc gọi thứ hai Update . Vì vậy, ElapsedGameTimecho thấy thời gian trôi qua kể từ Updatecuộc gọi đầu tiên .

OTOH, TotalGameTimenói:

Lượng thời gian trò chơi kể từ khi bắt đầu trò chơi .

Đây là một điều mơ hồ hơn, nhưng có vẻ như trò chơi không thể được coi là bắt đầu, cho đến khi nó bước vào một vòng lặp chính và bắt đầu tự vẽ. Do đó TotalGameTimecập nhật chính nó lần đầu tiên sau cuộc gọi thứ hai đến Update. Do đó sự khác biệt bạn quan sát.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.