【问题标题】:What is the clock source for the count returned by QueryPerfomanceCounterQueryPerfomanceCounter 返回的计数的时钟源是什么
【发布时间】:2009-11-13 19:49:02
【问题描述】:

我的印象是 QueryPerformanceCounter 实际上是在访问为 HPET(高性能事件计时器)提供数据的计数器——当然,不同之处在于 HPET 是一个计时器,它在计数器值与所需间隔匹配时发送中断而要“使用”QueryPerformanceCounter 来制作计时器,您必须在软件中编写自己的循环。

我假设两者背后的硬件相同的唯一原因是因为我在某处读到 QueryPerformanceCounter 正在访问芯片组上的计数器。

http://www.gamedev.net/reference/programming/features/timing/ 声称 QueryPerformanceCounter 使用显然具有指定时钟速率的芯片组计时器。但是,我可以验证 QueryPerformanceFrequency 在不同的机器上返回的数字大不相同,事实上,这个数字在每次启动时会略有变化。

返回的数字有时可能完全荒谬——暗示在纳秒范围内的滴答声。当然,当放在一起时,一切正常;也就是说,使用 QueryPerformanceCounter/QueryPerformanceFrequency 编写计时器软件可以让您获得正确的计时并且延迟非常低。

使用这些功能的软件计时器可能非常好。例如,间隔为 1 毫秒,超过 30 秒很容易接近 100% 的滴答落在预期间隔的 10% 内。使用 100 微秒的间隔,您仍然可以获得很高的成功率 (99.7%),但最差的滴答声可能会遥遥无期(200 微秒)。

我想知道 HPET 后面的时钟是否相同。假设 HPET 仍然应该提高准确性,因为它是一个硬件计时器,但目前我还不知道如何在 Windows 中访问它。

【问题讨论】:

  • 顺便说一下,我的测试都是在Windows XP(32位)下运行的

标签: windows timer


【解决方案1】:

听起来微软已经让这些功能使用“任何最好的计时器”:

http://www.microsoft.com/whdc/system/sysinternals/mm-timer.mspx

【讨论】:

    【解决方案2】:

    您是否尝试为您的 AMD 多核系统更新 CPU 驱动程序?您是否检查过您的主板芯片组是否在“坏”列表中?您是否尝试设置 CPU 亲和性?

    人们还可以使用基于 RTC 的时间函数和/或跳跃检测启发式来消除 QPC 的问题。

    这有一些提示:CPU clock frequency and thus QueryPerformanceCounter wrong?

    请改进这一点。这是一个社区维基。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 2012-02-27
      • 2011-12-20
      • 1970-01-01
      • 2020-08-13
      • 2011-06-12
      相关资源
      最近更新 更多