是否有可能在Java / JavaFX中评估按下键盘按钮和执行代码行之间的延迟?想象一下情况,我向用户展示刺激,其任务是在他或她感知刺激时击中SPACE键。如何最准确地获得显示刺激和敲击键盘键之间的延迟?
到目前为止,我已经使用过这样的东西:
long start_time = System.currentTimeMillis();
displayTheStimulus();
long end_time;
if (spacebarIsHitted()) {
end_time = System.currentTimeMillis();
} else {
end_time = start_time;
}
long difference = end_time-start_time
我怎么能确定这种方法给出的值是否有效且准确?有没有办法评估这种方法的准确程度?
答案 0 :(得分:1)
根据java System文档,您可以使用System.nanoTime()来测量某些操作所需的时间,它使用更高分辨率的计时器(取决于底层平台的可用性)。基于该平台,您可能会有轻微的错误率。
此外,由于您使用JavaFX for GUI,因此从this answer
复制以下内容根据JavaFX Architecture,它使用本机事件队列 捕获和批处理所有事件。通过捕获它是理解的 在那个时刻生成了事件(用户点击了 按钮)。考虑到批处理我们已经失去了 有关事件生成时间的信息(除非JavaFX 在内部保存该信息,您可以检查com.sun.javafx 包含较低级别的详细信息)。每1/60秒就有一个 预定脉冲事件。在脉冲事件期间所有其他JavaFX事件 像MouseEvent等通过普通的JavaFX事件触发 调度机制。此时您的申请将会 从JavaFX收到发生事件的通知。所以 一个理想的世界,一个事件发布的时间与之间的差异 它的处理时间应该是< 0.0166(6)秒。
简而言之,当SPACE键实际命中时,当JavaFX告诉您键被击中的时间是不同的值时,差异应该是< 0.0166(6)秒。所以你必须考虑到这一点。值得注意的是,如果由于任何原因JavaFX应用程序线程被延迟,差异也会增加,因此错误率会更高。