0

我的游戏计时器有一个有趣但奇怪的问题。似乎毫秒工作得很好。但是,当我尝试应用std::chrono::seconds演员表时,我突然0.000000在转换为浮点数时得到了。

我的计时器如下:

 #include <iostream>
 #include <time.h>
 #include <chrono>


 class Timer
 {
 public:

     typedef std::chrono::high_resolution_clock Time;
     typedef std::chrono::milliseconds ms; //<--If changed to seconds, I get 0.00000
     typedef std::chrono::duration<float> fsec;

     std::chrono::high_resolution_clock::time_point m_timestamp;

     float currentElapsed;

     Timer()
     {
          m_timestamp = Time::now();
     }

     float getTimeElapsed()
     {
         return currentElapsed;
     }

     void Tick()
     {
         currentElapsed = std::chrono::duration_cast<ms>(Time::now() - m_timestamp).count();
         m_timestamp = Time::now();
     }

 public:
     //Singleton stuff
     static Timer* Instance();
     static void Create();
 };

计时器每帧打勾一次。因此,例如,我通常每帧大约 33 毫秒。33ms / 1000 = 0.033s秒,所以应该有足够的空间来容纳它。

关于可能发生的事情的任何想法?

任何帮助是极大的赞赏!

编辑:对不起,秒,而不是毫秒

4

1 回答 1

1

std::chrono::seconds等。都指定为具有整数表示(C++11 §20.11.2 [time.syn])。当您将高分辨率持续时间转换为低分辨率持续时间时,您正在执行整数除法并导致截断,例如,

using namespace std::chrono;
assert(duration_cast<seconds>(milliseconds{999}) == seconds{0});

您可以通过在缩放之前而不是之后切换到浮点表示来避免这种截断:

using namespace std::chrono;
currentElapsed = duration_cast<duration<float,std::milli>>(Time::now() - m_timestamp).count();

在 coliru 演示

更好的是,存储currentElapsed为 aduration以保持与幅​​度相关的“单位”

class Timer {
    typedef std::chrono::high_resolution_clock Time;
    typedef std::chrono::duration<float> duration;

    Time::time_point m_timestamp;
    duration currentElapsed;

public:
    Timer() : m_timestamp(Time::now()) {}

    duration getTimeElapsed() const {
        return currentElapsed;
    }

    void Tick() {
        auto now = Time::now();
        currentElapsed = now - m_timestamp;
        m_timestamp = now;
    }
};
于 2013-12-20T19:36:53.590 回答