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

Is timeGetTime a good way to meassure time for a gameloop?

本文关键字:方法 时间 循环 游戏 timeGetTime      更新时间:2023-10-16

我试图创建一个游戏循环,其fps取决于迭代速度。为了实现这一点,我想使用一个特定于平台的计时器,该计时器(在windows的情况下)使用timeGetTime函数(https://learn.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;

计时器类如下所示:(begin是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毫秒的间隔。我意识到这也是因为计时器不准确,但仍然如此。据我所知,你的电脑应该尽可能快地执行这个程序,这是真的吗?如果你想以每秒60帧的速度运行游戏,每个循环大约需要16毫秒,如果每次仅调用计时器平均需要2毫秒,而且你仍然需要处理输入、更新和渲染,这怎么可能呢?那么,我应该在这里做什么,timeGetTime是你可以在游戏循环中使用的东西吗(这已经被建议了很多),还是我应该考虑另一个函数?

我建议使用QueryPerformanceCounter而不是

https://msdn.microsoft.com/en-us/library/windows/desktop/ms644904(v=vs.85).aspx

Windows多媒体API的Timers是动画、游戏等的不错选择。在Windows平台上具有最高精度。Qt使用并鉴定此计时器也是精确计时器。

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

在Windows上,Qt将使用Windows的多媒体定时器功能(如果可用)用于Qt::PreciseTimer和用于Qt::CoarseTimer和Qt:。