timeGetTime是衡量游戏循环时间的好方法吗?

时间:2019-01-25 16:16:04

标签: c++ winapi

我试图根据其迭代速度创建一个fps的游戏循环。为此,我想使用特定于平台的计时器(对于Windows,该计时器使用timeGetTime函数(https://docs.microsoft.com/en-us/windows/desktop/api/timeapi/nf-timeapi-timegettime)来计算自上次迭代以来经过了多少时间。但是我发现调用此函数所需的时间已经很多(对于计算机)。现在我想知道这是否是正确的方法。

我创建了一个简单的测试,如下所示:

Timer timer();
    for (int i=0; i < 60; i++)
        cout << timer->get_elt() << endl;
    delete timer;

计时器类如下:(开始是DWORD)

Timer::Timer()
{
    begin = timeGetTime();
}
int Timer::get_elt()
{
    return timeGetTime() - begin;
}

不是很有趣,但是下面是结果示例:

0 0 1 3 4 14 15 15 15 16 16 17 17 17 17 18 19 19 19 19 20 20 20 20 20 21 21 21 21 21 22 22 22 22 22 22 23 23 23 25 38 39 39 55 56 56 66 68 68 69 71 71 72 73 73 73 73 73 74 74

我原本期望这最多花​​费大约10毫秒,但平均花费大约64毫秒。 最令我惊讶的是结果多么古怪。有时,它最多打印相同数字的7倍,而在其他时候,迭代之间的间隔为12毫秒。我意识到这也是因为计时器不准确,但仍然如此。据我所知,您的PC应该尽可能快地执行此程序,这是真的吗? 如果您想以60 fps的速度运行游戏,则每个循环大约需要16毫秒,并且如果每次单独调用计时器平均大约需要2毫秒,那么您仍然需要处理输入,更新和渲染, 这怎么可能呢? 所以我应该在这里做些什么,您可以在游戏循环中使用timeGetTime(很多建议),还是应该考虑另一个函数?

2 个答案:

答案 0 :(得分:2)

答案 1 :(得分:0)

Windows Multimedia API中的Timers是动画,游戏等的不错选择。 在Windows平台上具有最高的精度。 Qt使用该计时器并将其定为精确计时器。

http://doc.qt.io/qt-5/qt.html#TimerType-enum

  

在Windows上,Qt将使用Windows的多媒体计时器功能(如果   适用于Qt :: PreciseTimer和普通Windows计时器   Qt :: CoarseTimer和Qt :: VeryCoarseTimer。