是否可以使用查询性能计数器(Win32,C)获取时间戳

Is it possible to get Time stamps with use of Query performance counter (Win32,C )?

本文关键字:获取 时间戳 Win32 可以使 查询 性能计数器 是否      更新时间:2023-10-16

是否可以使用查询性能计数器(Win32,C++)获取时间戳?如果没有,在Win32-C++应用程序上获取时间戳的最准确方法是什么?

QueryPerformanceCounter只是一个计数器,当机器通电并向上计数时,它包含一些值。它根本没有连接到挂钟。

CCD_ 2和CCD_
如果你只针对Windows 8,那么GetSystemTimePreciseAsFileTime是非常精确的。

如果您在Windows pre 8上需要真正的高分辨率时间,您可以尝试使用系统时间和性能计数器的混合方法,如这里所述:为Windows 实现持续更新、高分辨率时间提供程序

如果您使用的是C++11,那么您可能还需要查看std::chrono::system_clockstd::chrono::high_resolution_clock

硬件中有哪些时钟源?

如果您想要准确性,就不能使用QueryPerformaceCounter,因为它会随着CPU时钟而变化,这很快但并不准确。

中断定时器:这个定时器产生一个频率为1kHz的中断,可能非常准确。

HPET:1 MHz定时器。这个是你想要使用的。

音频接口采样时钟:该时钟的频率取决于音频采样率,但中断频率取决于声音缓冲区大小,通常需要长于几毫秒。

我已经成功地使用Waitable Timer以40ms的间隔驱动屏幕捕获程序。有关演示,请参阅:http://www.youtube.com/watch?v=SLad8-IRtg4。音轨是通过从音频输出到音频输入的模拟反馈记录的,这表明帧时钟与音频设备的采样时钟保持同步。相同的时钟应该在1毫秒内工作,但当机器忙于渲染3d内容并将视频帧压缩为PNG时就不行了:-)

要使用音频设备时钟,请将其记录到虚拟缓冲区。在Windows7上,使用新的音频架构来获得尽可能小的缓冲区大小。在较旧的系统上,您需要内核流。如果你要进行音频咨询,你也可以将函数生成器插入你的波形设备,并有一个循环,根据触发条件返回时间戳。通过这种方式,您将达到1毫秒以下。