timeGetTime是衡量游戏循环时间的好方法吗
Is timeGetTime a good way to meassure time for a gameloop?
我试图创建一个游戏循环,其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:。
- C++为构建时间获取QDateTime的可靠方法
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 将时间戳打印到流的最简单方法
- 通常使用什么方法来检测时间情况?
- 在C++中执行 N 阶乘编译时间的 3 种不同/相同方法
- 有没有更准确的方法来记录C++时间?
- 在给定程序中降低矢量数组实现堆栈的时间复杂度有哪些不同的可能方法?
- 更好的单元测试方法,花费的时间太长
- 替换枚举以最大化编译时间检查的最佳方法
- 如何在长时间运行的方法中等待信号?
- 使用 GetLastError() 的真正正确的方法(时间)是什么?
- 为什么以相同的数量插入到集合中,基于不同的方法具有不同的运行时间?
- C 类方法的执行时间取决于什么
- 扩展中的日期时间对象方法C++问题
- 一定时间后强制终止方法
- 此插入方法的时间和空间复杂性
- 如何恢复注册表项的所有元素?(上次写入时间,类型,值,名称...这是正确的方法吗?
- 查找系统调用需要多长时间的可能方法
- 在 C++11 中表示日内时间 HH:MM:SS 的最佳方法是什么?
- C 编译时间检查模板类型中是否存在方法