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();
 };

タイマーはフレームごとに 1回ティックされます。たとえば、通常、フレームあたり約 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();

(コリールでデモ)

さらに良いことに、マグニチュードに関連付けられた「単位」を保持するためにとして保存currentElapseddurationします。

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 に答える