C++获取经过的时间(跨平台)

4

为了一个游戏,我想要测量自上一帧以来经过的时间。

我使用了glutGet(GLUT_ELAPSED_TIME) 来实现这个功能。但是在包含glew之后,编译器无法找到 glutGet函数(奇怪)。因此,我需要另一种替代方法。

我发现大多数网站都建议在 ctime 库中使用 clock 函数,但那个函数只能度量程序的 CPU 时间而非真实时间!ctime库中的 time 函数精确到秒,而我需要至少毫秒级别的精度。

我可以使用 C++11。


注意:您应该能够同时使用glew和glut,这里有一条说明链接。只需确保在glut之前包含glew即可。 - Boris Dalstein
可能是C ++跨平台高分辨率计时器的重复问题。 - Ben Voigt
@Boris 我确保在 glut 之前包含了 glew。 - relgukxilef
2个回答

5

在C++11之前,我认为没有内置高分辨率时钟。如果您无法使用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;
};

一些平台(如Win32)需要编写自己的时钟类,因为库中的时钟类分辨率非常低。但是至少坚持使用C++11接口将最小化非可移植代码。 - Ben Voigt
这里有一个实现:https://dev59.com/RGYr5IYBdhLWcg3w8-rA#13266477 和另一个实现:https://dev59.com/nHI_5IYBdhLWcg3wMf9_#5524138 - Ben Voigt
@BenVoigt 我从来没有遇到过QueryPerformanceFrequency/QueryPerformanceCounter的任何问题。特别是对于游戏来说,不应该有问题。虽然这个bug很有趣,但“修复”更有趣! - typ1232
QueryPerformanceCounter 是一个非破损的时钟(但也不可移植)。Visual C++ 的 high_resolution_clock 使用系统滴答声,大约为 15 毫秒 - 这是有问题的。请参阅链接的答案以获取更多信息和错误报告。 - Ben Voigt
在进行持续时间计算时,除非high_resolution_clock ::is_steady()== true,否则不要依赖high_resolution_clock。 - Iwan Aucamp

2
  1. Boost提供了类似于std::chrono的时钟:boost::chrono
  2. 如果您想使用它来计算持续时间,应该考虑使用std::chrono::steady_clock(或其boost等效物),而不是std::chrono::high_resolution_clock,或者至少确保std::chrono::steady_clock::is_steady() == true。因为非稳定时钟返回的时间可能会随着物理时间的推移而减少。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接