我正在为使用C++的系统编写模拟器,使用Qt进行UI,事件处理等.显然,我需要有一个准确的计时参考.现在,我使用具有适当间隔的QTimer(NTSC为16.66667 ms,PAL为20 ms),但正如预期的那样,其准确性非常糟糕.有时计时器以50 FPS的速度发射,有时甚至是120 FPS.
我意识到大多数操作系统都有一些功能可以提供精确的时间戳,直到微(或纳秒)二级.(即QueryPerformanceCounter在Windows上.)
我没有使用系统时钟,而是考虑与音频时钟同步,因为我已经有了音频输出流,但我不认为Qt提供了功能.
什么是最简单(和/或最好)的方法同步到某个准确的时钟以在特定时间间隔调用函数,在正常情况下几乎没有抖动,来自C++/Qt?
高分辨率时间戳并不意味着内核中存在一种机制,当达到高分辨率时间戳的给定值时,该机制将唤醒休眠线程.
在Qt和Windows上,当你的定时器超时"足够短"(<= 10ms IIRC)时,Qt会强制系统的滴答间隔为~1ms(1000Hz或1024Hz).
你需要做的是如下:
使用QElapsedTimer(在内部使用Windows上的性能计数器或其他任何可提供最高分辨率的时间)来跟踪高分辨率时间.
根据#1的高分辨率时间值设置计时器到期时间.
当然,你需要处理花费太长时间的帧,错过的计时器等等.但这是让它工作的唯一理智的方式.
或者,您可以在音频缓冲区已耗尽到某个级别时使用通知.Qt 5可以为此提供API.
在任何操作系统上生成更好的时序的唯一方法是使用除通用计时器滴答之外的专用硬件.这样的硬件可能就像在环回模式下运行的串行端口一样简单.它作为一个额外的独立的可等待事件源非常有用.音频缓冲交换也是一个很好的定时源.
如果您希望进一步权衡功耗以获得定时精度,则可以在轮询高分辨率时间源时专用超线程来忙碌等待.这不是一件轻松的事情,但对于某些应用,比如测试线束,它可能没问题.笔记本电脑/笔记本电脑/平板电脑用户会讨厌你.
谨防一篇精彩的文章,提出一个没有机会工作的解决方案,在没有真正(相对于想象的)网卡"定时器"的情况下会以某种方式影响套接字轮询等待.
| 归档时间: |
|
| 查看次数: |
8107 次 |
| 最近记录: |