QueryPerformanceCounter()vs QueryInterruptTime()vs KeQueryInterruptTime()

时间:2016-07-26 11:03:24

标签: windows winapi time timer

我正在编写一个快速且相当准确的游戏计时器,可在Windows上使用。 Microsoft建议使用QueryPerformanceCounter()进行高分辨率计时,并按预期工作,但我正在寻找可以减少执行开销的替代方案。

我做了一些谷歌搜索,发现提到了QueryInterruptTime(),并且它的对应QueryInterruptTimePrecise()应该更精确,但会产生更大的开销。他们的文档(herehere)描述了他们将系统中断时间计数到最近的系统节拍(或100ns单位)。 QueryInterruptTime()开始看起来很适合作为时间候选者,但很少有关于它的优点及其怪癖的文档。

然后有KeQueryInterruptTime()KeQueryInterruptTimePrecise(),我不知道他们与“非Ke”兄弟姐妹的区别。

任何人都可以描述QueryInterruptTime()和KeQueryInterruptTime(),它们的区别,优点和缺点,并将它们与更普遍的QueryPerformanceCounter()进行比较吗?

1 个答案:

答案 0 :(得分:2)

QueryInterruptTime()QueryInterruptTimePrecise()要求Windows 10 / Server 2016作为最低版本。

阅读QueryPerformanceCounter()文档时,您必须阅读Acquiring high-resolution time stamps。这清楚地揭示了QueryPerformanceCounter()的优点和缺陷。该功能仅显示HPET和PM计时器平台上的显着开销,因为它需要在此类平台上进行内核转换。更新的平台使用CPU时间戳计数器(TSC)执行计时和性能计数器业务,而开销非常小。

如果只是准确的时间,你也可以查看GetSystemTimePreciseAsFileTime()。 Windows 8 / Server 2012(仅限桌面)支持此功能。但是,它也使用了引擎盖下的性能计数器,因此在开销(HPET / PM计时器)方面遇到了相同的瓶颈。

同样适用于函数QueryInterruptTimePrecise()

函数KeQueryUnbiasedInterruptTime()可以在内核模式驱动程序中使用,与KeQueryInterruptTimePrecise()相比,它可以准确地桥接睡眠状态。注意:这里没有内核转换,但你必须在别处进行转换我怀疑。

不幸的是,没有KeQueryUnbiasedInterruptTimePrecise()