颤振,动画和调度程序

时间:2019-11-19 19:52:57

标签: flutter

当新的帧呈现给人类观察者物理可见时,如何获得确切的时间点?我更喜欢使用材质小部件而不是dart:ui将应用程序组合在一起。

这项工作的目的是测量人类的反应时间,这是心理学和认知科学的基础研究方法。人的反应时间是屏幕/人视网膜上的刺激的物理发作与装置上的人的反应的物理发作(即点击或点击)之间的时间跨度。反应的时间戳很容易获得,因此在这个问题中,我将重点放在刺激表示的时间点的近似上。

认知科学中的反应时间实验类似于简单的复古计算机游戏。一种方法是使用游戏框架,该框架与简单的Animation没有太大区别。在Flutter中,Animationcontroller通过股票行情指示器的滴答声同步,可用于触发setState。与帧的同步确保了时间测量的相对较低的变化,但是当新的动画帧对观察者而言物理可见时,它不提供(系统)时间的绝对点。调用setState与将修改后的小部件呈现到屏幕之间将存在恒定的时间差。

因此,有两个要求:

  1. 尽可能精确地看到框架在物理上可见的时间点,
  2. 保证部件树中的更改实际上要在带有时间戳的帧中呈现,而不是在以后的帧中呈现,这是因为准备工作需要很长时间。

有办法满足这两个要求吗?

1 个答案:

答案 0 :(得分:1)

这实际上取决于您实际需要达到的精度。考虑到现代多任务操作系统的复杂性,我认为当新框架可见时,您将无法准确地找到 -在软件和软件中都存在太多变量需要考虑显示硬件本身。

这并不重要,具体取决于实验的性质。

您应该做的第一件事是验证您的测试仪器。通过这种方式,我的意思是您可能需要找出一种方法来测量Flutter说帧完成与帧实际出现在屏幕上之间的时间差。如果持续时间足够一致,则可以对数据进行更正。

我认为在Flutter中获取帧时间的最好方法是SchedulerBinding中的回调。我将看看使用addPersistentFrameCallbackaddPostFrameCallback的时间差异。根据文档,addPostFrameCallback似乎是最合适的:

  

此回调在框架中运行,紧接在持久性框架回调之后(即刷新主渲染管道时)

您需要验证的另一件事是输入延迟(物理点击屏幕与在应用程序中注册之间的时间)。

同样,所有这些绝对精度都可能无关紧要,具体取决于实验的种类。人类的视觉反应时间为approximately 250ms。如果您在120Hz的显示器上运行您的应用程序,则一帧为8ms-因此您可以测量到+/- 3%,这非常好。例如,如果您的实验是关于比较不同视觉提示的响应,则绝对精度并不像每个提示的相对性能那么重要。