繁体   English   中英

Qt中屏幕绘制和键盘按键事件的确切延迟

[英]Exact delay in screen draw and keyboard keypress event in Qt

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

我考虑过在QWidget的paint事件中使用QTimeQElapsedTimer对象,但是我不确定这是否可以实现我的目标。

类似地,当用户按下某个键时,将基于键盘的轮询速率在短暂的延迟后将其注册。 我还需要考虑这一延迟。 如果我能获得投票率,我平均知道延迟将达到多少。

根据定义,您要的是无法从计算机内部实现的。

您希望如何分辨像素“实际显示”在屏幕上的时间,而传感器不会粘在显示器上,也不会同步到计算机也可以访问的原子钟? :-)

由于Qt通常用作Win / OSX / Linux之上的抽象层,因此与Qt的可能性甚至更大。 首先,这些不是任何种类的实时操作系统

您所知道的只是当您要求发生某些事情时。 然后,您可以确定要重新控制另一个请求所花费的时间。 通过执行此操作,可以对基本的“帧速率”吞吐量设置一些期望,但是有无数因素可能随时导致性能差异很大。

如果您可以深入研究内核/驱动程序级别,则可以找到对硬件产生实际影响的更精确的度量。 但这不是Qt的领域,并且仍然没有告诉您这种影响何时在外界显现的“实际”答案。

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

与搜索字词“高分辨率计时器”相关的内容可能会给您带来一些帮助:

我考虑过在QWidget的paint事件中使用QTimeQElapsedTimer对象,但是我不确定这是否可以实现我的目标。

实际上,这是唯一的方法,并且实际上是您可以做的所有事情。 如果不依靠实时操作系统,自定义驱动程序或外部硬件,则无法做其他任何事情。

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

请注意,当事件循环为空时,假设未抢占您的进程,则在widget.update()调用与paintEvent执行之间的延迟不到一微秒。

这是一些研究的反应时间实验。 呈现了视觉输入,用户可以通过键盘或鼠标对其进行响应。 为了能够精确地找到反应时间,我需要知道何时在屏幕上显示刺激,何时按下键。

实际上,只有一种方法可以正确地做到这一点,而无需借助实时操作系统或自定义驱动程序,而还有很多方法可以做到这一点。 那么,正确的方法是什么?

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

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

这种方法与屏幕无关,只要您可以在某种程度上与计时器硬件接口,您就可以在移动设备上使用它。 计时器硬件当然可以联网,从而简化了接口。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM