C++ c++;获取独立于平台的运行时间

C++ c++;获取独立于平台的运行时间,c++,cross-platform,C++,Cross Platform,对于一个游戏,我想测量从最后一帧开始经过的时间 我使用了glutGet(GLUT\u exposed\u TIME)来实现这一点。但是在包含了glew之后,编译器再也找不到glutGet函数了(奇怪)。所以我需要一个替代方案 到目前为止,我发现的大多数网站都建议在ctime中使用时钟,但该功能只测量程序的cpu时间,而不是实时时间!ctime中的时间函数仅精确到秒。我需要至少毫秒的准确度 我可以使用C++ 11。< /P> < P>我不认为C++ 11之前有一个高分辨率时钟内置C++。如果无法使

对于一个游戏,我想测量从最后一帧开始经过的时间

我使用了
glutGet(GLUT\u exposed\u TIME)
来实现这一点。但是在包含了glew之后,编译器再也找不到glutGet函数了(奇怪)。所以我需要一个替代方案

到目前为止,我发现的大多数网站都建议在ctime中使用时钟,但该功能只测量程序的cpu时间,而不是实时时间!ctime中的时间函数仅精确到秒。我需要至少毫秒的准确度


<>我可以使用C++ 11。< /P> < P>我不认为C++ 11之前有一个高分辨率时钟内置C++。如果无法使用C++11,则必须使用glut和glew修复错误,或者使用依赖于平台的计时器函数

#include <chrono>
class Timer {
public:
    Timer() {
        reset();
    }
    void reset() {
        m_timestamp = std::chrono::high_resolution_clock::now();
    }
    float diff() {
        std::chrono::duration<float> fs = std::chrono::high_resolution_clock::now() - m_timestamp;
        return fs.count();
    }
private:
    std::chrono::high_resolution_clock::time_point m_timestamp;
};
#包括
班级计时器{
公众:
计时器(){
重置();
}
无效重置(){
m_timestamp=std::chrono::high_resolution_clock::now();
}
浮动差(){
std::chrono::duration fs=std::chrono::high_resolution_clock::now()-m_时间戳;
返回fs.count();
}
私人:
标准::时钟::高分辨率时钟::时间点m_时间戳;
};
  • Boost提供了std::chrono类时钟:
  • <> LI>您应该考虑使用STD::ToRo::SturyYalCHILL(或Boost等效),而不是STD::HealO::HyLyRealPrimeSythCalor,或者至少确保STD::Stimo::StestyLyCalth::IsStand()=真(如果你想用它来计算持续时间),因为非平稳时钟返回的时间甚至会随着物理时间的推移而减少。
    注意:您应该能够同时使用glew和glut,这里有一个注意事项。只需确保在glut之前包含glew。可能重复@Boris我确保在glut之前包含glew。某些平台(Win32)将需要编写自己的时钟类,因为库类已损坏(分辨率非常低)。但是坚持使用C++11接口至少可以最小化不可移植的代码。而且@BenVoigt我从来没有在QueryPerformanceFrequency/QueryPerformanceCounter上遇到过任何问题。特别是对于一场比赛,应该没有问题。非常有趣的错误和更有趣的“修复”虽然
    QueryPerformanceCounter
    是未中断的时钟(但也是不可移植的)。Visual C++的
    高分辨率时钟
    使用的系统刻度约为15毫秒,这是坏的。有关更多信息和错误报告,请参阅链接的答案。您确实不应该依赖高分辨率时钟,除非高分辨率时钟::对于持续时间计算是稳定的()。