【发布时间】: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位)下运行的