我试图根据其迭代速度创建一个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(很多建议),还是应该考虑另一个函数?
答案 0 :(得分:2)
我建议改用QueryPerformanceCounter
https://msdn.microsoft.com/en-us/library/windows/desktop/ms644904(v=vs.85).aspx
答案 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。