我的游戏计时器出现了一个有趣但奇怪的问题。似乎毫秒工作得很好。但是,当我尝试应用 std::chrono::seconds
转换时,我突然得到 0.000000
转换为 float 。
我的计时器如下:
#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
秒,所以应该有足够的位空间来容纳它。
对可能发生的事情有什么想法吗?
非常感谢任何帮助!
编辑:对不起,秒,不是毫秒
最佳答案
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();
( Demo at coliru )
更好的是,store currentElapsed
as a duration
to keep the "units" associated with the magnitude :
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;
}
};
关于c++ - 计时定时器不能正确转换秒数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20710213/