我正在从事一个Qt项目,在这个项目中,某些事件发生的确切时间是最重要的。具体来说:我有一个非常简单的动画,必须在特定时间绘制到屏幕上,比如t1。一旦我发布QWidget
更新来启动动画,它将花费一小段时间dt (取决于屏幕刷新速率等)。在屏幕上显示更新。我需要测量这个额外的时间,我不知道该怎么做。
我曾想过在QTime
事件的QWidget
中使用QWidget
和QElapsedTimer
对象,但我不确定这是否能实现我的目标。
类似地,当用户按下一个键时,它将在基于键盘的轮询率的一个小延迟之后被注册。我也需要解释一下这次延误的原因。如果我能得到投票率,我知道平均会有多少延迟。
发布于 2014-06-10 06:45:15
你想要的是--从定义上来说--不可能在电脑里实现。
如果没有传感器固定在显示器上,并与计算机也可以访问的原子钟同步,那么如何才能知道屏幕上什么时候出现了像素?:-)
Qt的可能性更大,因为它通常被用作Win/OSX/Linux之上的抽象层。这些根本就不是任何形式的实时操作系统。
你所能知道的只有当你要求发生什么事。然后,您可以确定您需要多长时间才能重新控制发出另一个请求。通过这样做,您可以对基本的“帧速率”吞吐量设置一些期望,但是有无数的因素可能导致性能在任何时候都有很大的差异。
如果您能够深入到内核/驱动程序级别,您可以找到一个更接近于金属测量的实际效果何时到达硬件。但这不是Qt的领域,仍然没有告诉你什么时候效应在外部世界显现的“实际”答案。
Qt中最好的是一个周期QTimer。它可以(大致)毫秒分辨率进行回调。如果这还不够好..。你需要一艘更小的船。:-)
你可能会从与搜索术语“高分辨率定时器”相关的东西中得到一些刺激。
发布于 2014-06-10 18:36:36
我曾想过在
QTime
事件的QWidget
中使用QWidget
和QElapsedTimer
对象,但我不确定这是否能实现我的目标。
事实上,这是唯一的方法,也是你能做的所有事情。如果不使用实时操作系统、自定义驱动程序或外部硬件,就无法再做任何事情了。
您可能不需要这两种方法--测量自上次更新以来所经过的时间的QElapsedTimer
就足够了。
请注意,当事件循环为空时,在没有抢占进程的前提下,调用widget.update()
和执行paintEvent
之间的延迟在微秒以下。
这是一些研究的反应时间实验。给出了用户通过键盘或鼠标响应的视觉输入。为了准确地找到反应时间,我需要知道什么时候屏幕上出现了刺激,什么时候按了键。
从本质上说,只有一种方法可以在不使用实时操作系统或自定义驱动程序的情况下正确地完成它,并且有很多错误的方法。那么,正确的方法是什么?
屏幕的一小部分需要改变颜色或亮度,与视觉刺激的呈现巧合。您可以将光纤连接到屏幕上,并将其传送到连接到外部事件计时器的接收器中。键盘中的联系人闭包也提供给相同的事件计时器。这使您可以精确地计时响应的延迟时间,而不考虑操作系统延迟、线程抢占等。如果您愿意做更多的开发工作,事件计时器可以像阿杜伊诺一样便宜。
如果你重复显示刺激,并且在刺激演示之间需要一个特定的时间,你只需经常重复演示,并收集数据中的响应延迟和刺激到刺激的时间。然后,您可以丢弃超出预期公差的演示文稿。
这种方法与屏幕无关,您甚至可以在移动设备上使用它,只要它可以与您的计时器硬件进行某种程度的接口。定时器硬件当然可以联网,使接口容易。
https://stackoverflow.com/questions/24141378
复制相似问题