2

我正在做一个 Qt 项目,其中某些事件发生的确切时间是最重要的。具体来说:我有一个非常简单的动画,必须在特定时间绘制到屏幕上,比如 t1。一旦我发布QWidget更新以启动动画,将需要一小段时间 dt(取决于屏幕刷新率等)才能在屏幕上实际显示更新。我需要测量这个额外的时间 dt。我不确定该怎么做。

我曾想过在 the paint 事件中使用QTime和object,但我不确定这是否能实现我的目标。QElapsedTimerQWidget

同样,当用户按下一个键时,它将根据键盘的轮询率在一个小的延迟后注册。我还需要考虑这种延迟。如果我能得到投票率,我知道平均会有多少延迟。

4

2 回答 2

0

我曾想过在 the paint 事件中使用QTime和object,但我不确定这是否能实现我的目标。QElapsedTimerQWidget

事实上,这是唯一的方法,也是你真正能做的。如果不求助于实时操作系统、自定义驱动程序或外部硬件,就无法做进一步的事情。

您可能不需要两者 -QElapsedTimer测量自上次更新以来经过的时间就足够了。

请注意,当事件循环为空时,调用widget.update()paintEvent执行之间的延迟低于一微秒,假设您的进程没有被抢占。

这是一些研究的反应时间实验。呈现视觉输入,用户通过键盘或鼠标对其做出响应。为了能够准确地找到反应时间,我需要知道刺激是什么时候出现在屏幕上的,什么时候按键是被按下的。

基本上只有一种方法可以在不求助于实时操作系统或自定义驱动程序的情况下正确地做这件事,而做错的方法有很多。那么,正确的方法是什么?

屏幕的一小部分区域需要随着视觉刺激的呈现同时改变颜色或亮度。您将光纤连接到屏幕上,并将其馈送到连接到外部事件计时器的接收器中。键盘中的触点闭合也馈送到相同的事件计时器。这使您可以精确地计时响应的延迟,而无需考虑操作系统延迟、线程抢占等。如果您愿意做更多的开发工作,事件计时器可以像Arduino一样便宜。

如果您重复显示刺激并且在刺激呈现之间需要一定的时间,您只需经常重复呈现并在数据中收集响应延迟和刺激到刺激的时间。然后,您可以丢弃超出所需容差的演示文稿。

这种方法与屏幕无关,您甚至可以在移动设备上使用它,只要它能够以某种方式与您的计时器硬件交互。定时器硬件当然可以联网,使接口变得容易。

于 2014-06-11T02:36:36.297 回答
0

你所要求的是 - 根据定义 - 在计算机内部是不可能的。

如果没有将传感器粘在显示器上并与计算机也可以访问的原子钟同步,您如何能够判断像素何时“实际出现”在屏幕上?:-)

由于 Qt 通常被用作 Win/OSX/Linux 之上的抽象层,因此与 Qt 相比的可能性更大。那些一开始就不是任何类型的实时操作系统

你所能知道的就是当你要求某事发生时。然后,您可以计算重新获得控制权以提出另一个请求所需的时间。您可以通过这样做对您的基本“帧速率”吞吐量设置一些期望,但是有无数因素可能导致任何时候性能的巨大变化。

如果您可以深入了解内核/驱动程序级别,您可以找到一个更接近金属的衡量标准,即实际影响何时到达硬件。但这不是 Qt 的领域,并且仍然没有告诉您效果何时在外界显现的“实际”答案。

关于 Qt 的最佳效果是定期 QTimer。它可以(大约)毫秒分辨率进行回调。如果这还不够好……您将需要一艘较小的船。:-)

您可能会从与搜索词“高分辨率计时器”相关的内容中获得一点帮助:

于 2014-06-10T14:45:15.977 回答