我正在编写一个快速且相当准确的游戏计时器,可在Windows上使用。 Microsoft建议使用QueryPerformanceCounter()进行高分辨率计时,并按预期工作,但我正在寻找可以减少执行开销的替代方案。
我做了一些谷歌搜索,发现提到了QueryInterruptTime(),并且它的对应QueryInterruptTimePrecise()应该更精确,但会产生更大的开销。他们的文档(here和here)描述了他们将系统中断时间计数到最近的系统节拍(或100ns单位)。 QueryInterruptTime()开始看起来很适合作为时间候选者,但很少有关于它的优点及其怪癖的文档。
然后有KeQueryInterruptTime()和KeQueryInterruptTimePrecise(),我不知道他们与“非Ke”兄弟姐妹的区别。
任何人都可以描述QueryInterruptTime()和KeQueryInterruptTime(),它们的区别,优点和缺点,并将它们与更普遍的QueryPerformanceCounter()进行比较吗?
答案 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()
。