我认为这仍然有用:系统内核:提供多媒体定时器支持的指南。
它很好地解释了各种可用的定时器及其局限性。也许你的敌人不是分辨率,而是延迟。
QueryPerformanceCounter并不总是以CPU速度运行。实际上,在多处理器(/多核心)系统上,它可能会尝试避免RDTSC:如果Windows Vista及更高版本可用,则使用HPET,否则使用ACPI / PM计时器。
在我的系统上(Windows 7 x64,双核AMD),定时器运行在14.31818 MHz。
先前的系统也是如此:
默认情况下,Windows Server 2003 Service Pack 2(SP2)对所有多处理器APIC或ACPI HAL使用PM计时器,除非检查过程无法确定BIOS是否支持APIC或ACPI HAL。
问题是,当检查失败时。这仅意味着你的计算机/ BIOS存在某种损坏。然后,你可以修复BIOS(推荐),或者至少暂时切换到使用ACPI计时器(/usepmtimer)。
使用Stopwatch.IsHighResolution
检查高分辨率计时器支持非常容易,而不需要使用P/Invoke。然后可以查看Stopwatch.Frequency
来获取必要的QueryPerformanceCounter调用内部信息。
同时需要考虑的是,如果计时器失效,整个系统将变得混乱,并且通常会表现出负的经过时间、减速等行为,而不仅仅是您的应用程序受影响。
这意味着您实际上可以依赖于QueryPerformanceCounter。
与普遍认为的相反,QueryPerformanceFrequency()
“在系统运行时无法更改”。
编辑:根据QueryPerformanceCounter()
文档的说明,“调用哪个处理器并不重要” - 实际上,如果APIC/ACPI检测失败并且系统只能使用TSC,那么整个线程亲和力的操作都是不必要的。这应该是一个不应该发生的情况。如果在旧系统上发生了这种情况,制造商可能会提供BIOS更新/驱动程序修复。如果没有,/usepmtimer
启动开关仍然可用。如果它也失败了,因为系统除了Pentium TSC之外没有合适的计时器,你可能需要考虑干扰线程亲和性 - 但即使如此,在页面“社区内容”区域中提供的示例由于在每次启动/停止调用时设置线程亲和性而引入了相当大的延迟,可能会减少使用高分辨率计时器的好处。
游戏定时和多核处理器是关于如何正确使用它们的建议。请注意,它现在已经五年了,在那个时候较少的系统完全支持ACPI - 这就是为什么在抨击它时,文章会详细介绍TSC以及如何通过保持亲和线程来解决其限制性问题。
我相信现在很难找到一个没有任何ACPI支持和可用PM计时器的普通PC。最常见的情况可能是BIOS设置错误(有时是出厂默认设置)导致ACPI支持不正确。
逸闻轶事告诉我们,八年前这种情况只是极少数。 (读起来很有趣,开发人员绕过设计“缺陷”并抨击芯片设计师。公平地说,反过来也可能一样。:-))