【问题标题】:QueryPerformanceCounter() vs QueryInterruptTime() vs KeQueryInterruptTime()QueryPerformanceCounter() vs QueryInterruptTime() vs KeQueryInterruptTime()
【发布时间】:2016-07-26 11:03:23
【问题描述】:

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

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

还有KeQueryInterruptTime()KeQueryInterruptTimePrecise(),我不知道他们和他们的“非柯”兄弟有什么不同。

谁能描述 QueryInterruptTime() 和 KeQueryInterruptTime(),它们的区别、优缺点,并将它们与更普遍的 QueryPerformanceCounter() 进行比较?

【问题讨论】:

  • 这样的事情真的有要求吗?大多数游戏代码实际上并不需要知道“现在”的时间,而是关心帧实际呈现在屏幕上的时间。因此,您的游戏实际上关心计时器按照理想化的速率前进——这将提供最一致的用户体验——然后游戏循环以尽可能接近这个速率——可能使用 vsync 将帧传送到屏幕.
  • 是的,没错,我只是在列举可能存在的选项,以便尝试找到一种 QPC 替代方案,它提供的开销更少,但足够强大,可以使用可接受的游戏时间。

标签: windows winapi time timer


【解决方案1】:

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()

【讨论】:

  • 我想我会坚持使用 QueryPerformanceCounter()。谢谢你的解释:)
  • QueryPerformanceCounter 在 windows server 2016 中不起作用,是否有任何注册表设置或其他?
猜你喜欢
  • 1970-01-01
  • 2014-08-17
  • 2011-09-18
  • 1970-01-01
  • 2012-07-27
  • 1970-01-01
  • 2010-12-09
  • 2017-06-20
相关资源
最近更新 更多