Flutter 颤振、动画和调度程序

Flutter 颤振、动画和调度程序,flutter,Flutter,当一个新帧被渲染为对人类观察者物理可见时,我如何获得准确的时间点?我更喜欢使用material小部件而不是dart:ui来组装应用程序 这项工作的目的是测量人类的反应时间,这是心理学和认知科学的一种基本研究方法。人类反应时间是屏幕/人类视网膜上刺激的物理开始与人类反应的物理开始之间的时间跨度,即点击或点击设备。反应的时间戳很容易获得,因此在这个问题中,我重点关注刺激呈现时间点的近似值 认知科学中的反应时实验类似于简单的复古电脑游戏。一种方法是使用游戏框架,这与简单的动画没有太大区别。在颤振中,A

当一个新帧被渲染为对人类观察者物理可见时,我如何获得准确的时间点?我更喜欢使用material小部件而不是dart:ui来组装应用程序

这项工作的目的是测量人类的反应时间,这是心理学和认知科学的一种基本研究方法。人类反应时间是屏幕/人类视网膜上刺激的物理开始与人类反应的物理开始之间的时间跨度,即点击或点击设备。反应的时间戳很容易获得,因此在这个问题中,我重点关注刺激呈现时间点的近似值

认知科学中的反应时实验类似于简单的复古电脑游戏。一种方法是使用游戏框架,这与简单的动画没有太大区别。在颤振中,Animationcontroller通过可用于触发setState的滴答声同步。与帧的同步确保了时间测量的相对低方差,但当新动画帧在物理上对人类观察者可见时,它不提供(系统)时间的绝对点。在调用setState和将修改的小部件呈现到屏幕之间会有一个恒定的时间间隔

因此,有两个要求:

  • 尽可能精确地估计帧在物理上可见的时间点
  • 确保小部件树中的更改确实在时间戳帧中呈现,而不是在稍后的帧中呈现,因为准备工作需要很长时间
    是否有一种方法可以同时满足这两个要求?

    这实际上取决于您真正需要的精确程度。考虑到现代多任务操作系统的复杂性,我认为你无法准确地知道新框架何时可见——软件和显示硬件本身的变量太多了

    这可能无关紧要,取决于你实验的性质

    您应该做的第一件事是验证您的测试设备。我的意思是,你可能需要找出一种方法来测量颤振说帧完成的时间和帧实际出现在屏幕上的时间之间的差异。如果持续时间足够一致,则可以对数据应用更正

    我认为在Flutter中获取帧时间的最好方法是在中回调。我想看看使用
    addPersistentFrameCallback
    与使用
    addPostFrameCallback
    时的时间差异。从文档中可以看出,
    addPostFrameCallback
    最适合:

    此回调在帧期间运行,就在持久帧回调之后(即刷新主渲染管道时)

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


    同样,所有这些绝对精度可能并不重要,这取决于实验的类型。人的视觉反应时间是有限的。如果你在120Hz的显示器上运行你的应用程序,那么单帧是8ms,所以你可以测量到+/-3%,这是非常好的。例如,如果你的实验是比较对不同视觉线索的反应,那么绝对精度就没有每个线索的相对性能重要。

    参见
    /examples/layers/README.md
    @pskink这些例子的提示并不能回答问题。“onBeginFrame”和“onDrawFrame”是在实际渲染wiget中的cange之前的某个时间调用的。我需要将小部件中的更改呈现到显示器上的确切时间点。因此,为了最大限度地减少延迟,您最可能需要“原始”(使用直接
    Canvas
    drawing的最原始层)或“渲染”(使用
    RenderObject
    classes)层(而不是“小部件”层)-检查
    /examples/layers/raw
    /examples/layers/rendering
    ,当使用“raw”方法时,您可以尝试@pskink,这是一个非常好的提示。。。可能是最好的解决办法。