Windows QueryPerformanceCounter()与QueryInterruptTime()与KeQueryInterruptTime()的比较

Windows QueryPerformanceCounter()与QueryInterruptTime()与KeQueryInterruptTime()的比较,windows,winapi,time,timer,Windows,Winapi,Time,Timer,我正在写一个在Windows上使用的快速且相当准确的游戏计时器。Microsoft建议使用高分辨率计时,它的工作原理与预期一致,但我正在寻找产生较少执行开销的替代方案 我在谷歌上搜索了一下,发现上面提到了QueryInterruptTime(),以及它的对应项QueryInterruptTimePrecise(),它们应该更精确,但会带来更大的开销。他们的文档(和)描述了他们将系统中断时间计数精确到最近的系统刻度(或100ns单位)。QueryInterruptTime()作为一个计时候选者开始

我正在写一个在Windows上使用的快速且相当准确的游戏计时器。Microsoft建议使用高分辨率计时,它的工作原理与预期一致,但我正在寻找产生较少执行开销的替代方案

我在谷歌上搜索了一下,发现上面提到了QueryInterruptTime(),以及它的对应项QueryInterruptTimePrecise(),它们应该更精确,但会带来更大的开销。他们的文档(和)描述了他们将系统中断时间计数精确到最近的系统刻度(或100ns单位)。QueryInterruptTime()作为一个计时候选者开始看起来不错了,但是关于它的优点和特性的文档很少

还有,我不知道他们和他们的“非Ke”兄弟有什么不同

有人能描述一下QueryInterruptime()和KeQueryInterruptime()、它们的区别、优点和缺点,并将它们与更普遍的QueryPerformanceCounter()进行比较吗?

QueryInterruptime()
QueryInterruptimePrecise()
要求Windows 10/Server 2016作为最低版本

您必须在阅读
QueryPerformanceCounter()
文档时进行了阅读。这清楚地揭示了
QueryPerformanceCounter()
的优点和缺点。该函数仅在HPET和PM定时器平台上显示显著的开销,因为它需要在此类平台上进行内核转换。最近的平台使用CPU时间戳计数器(TSC)执行计时和性能计数器业务,开销很小

如果这只是一个精确的时间,你也可以看看。Windows 8/Server 2012(仅桌面版)支持此功能。但是,它也在引擎盖下使用性能计数器,因此在开销方面也存在同样的瓶颈(HPET/PM定时器)

这同样适用于函数
queryInterruptTimePrecision()

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

不幸的是,没有
KeQueryUnbiasedInterruptTimePrecise()

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

您必须在阅读
QueryPerformanceCounter()
文档时进行了阅读。这清楚地揭示了
QueryPerformanceCounter()
的优点和缺点。该函数仅在HPET和PM定时器平台上显示显著的开销,因为它需要在此类平台上进行内核转换。最近的平台使用CPU时间戳计数器(TSC)执行计时和性能计数器业务,开销很小

如果这只是一个精确的时间,你也可以看看。Windows 8/Server 2012(仅桌面版)支持此功能。但是,它也在引擎盖下使用性能计数器,因此在开销方面也存在同样的瓶颈(HPET/PM定时器)

这同样适用于函数
queryInterruptTimePrecision()

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


不幸的是,没有
KeQueryUnbiasedInterruptTimePrecise()

我想我会坚持使用QueryPerformanceCounter()。感谢您的解释:)QueryPerformanceCounter在windows server 2016中不工作,是否有任何注册表设置或其他设置?我想我将坚持使用QueryPerformanceCounter()。感谢您的解释:)QueryPerformanceCounter在windows server 2016中不工作,是否有任何注册表设置或其他设置?这样的事情实际上是一种要求吗?大多数游戏代码实际上不需要知道“现在”的时间,而是关心帧在屏幕上实际渲染的时间。因此,您的游戏实际上关心计时器按照理想速率前进-这将提供最一致的用户体验-然后游戏循环以尽可能接近此速率的速度向屏幕发送帧-可能使用vsync。是的,我只是列举了可能存在的选项,以试图找到一个QPC替代方案,提供较少的开销,但足够强大的使用允许可接受的游戏时间。这样的事情实际上是一个要求吗?大多数游戏代码实际上不需要知道“现在”的时间,而是关心帧在屏幕上实际渲染的时间。因此,您的游戏实际上关心计时器按照理想速率前进-这将提供最一致的用户体验-然后游戏循环以尽可能接近此速率的速度向屏幕发送帧-可能使用vsync。是的,我只是列举了可能存在的选项,以试图找到一个QPC替代方案,提供较少的开销,但足够强大的使用允许可接受的游戏时间。