在kivy(python)中,如何根据监视器上的帧刷新来确定按键的时间

2024-10-03 04:26:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我在kivy为心理研究开发一个应用程序,需要记录屏幕上显示的内容和用户按键盘键之间的延迟。实际上实现定时很容易,但是我留下了一些系统固有的延迟方差,我不知道如何消除它。在

如果它是一个持续的延迟,我可以从数据中减去它,但如果它变化,那是一个令人困惑的变量。在

我意识到键盘会有一些输入延迟(虽然我还没能找到一个解释这是什么的来源-我已经看到了从8毫秒到200毫秒的所有东西,我自己的测试表明最大值是30毫秒)。我想做的是当一个帧显示在监视器上时启动计时器,当按下一个键时停止计时器。在

我的代码的相关部分是测试屏幕和键盘侦听器。在

目前我有:

class TestScreen(Screen):
    def test_update(self,dt)
        self.ids.left_number.fontval = 200
        self.ids.right_number.fontval = 100
        response_time_start = time.clock()

我实现了一个键盘小部件:

^{pr2}$

test blank方法不接受任何输入,因此我只获取test_update帧的响应时间。这样做,我试图通过按下键盘上的“f”键并查看我得到的响应时间的分布来估计最大延迟。在

典型的设置如下所示:

Response time: 1.64090357165ms
Response time: 5.11166324745ms
Response time: 13.2276396813ms
Response time: 1.88118446611ms
Response time: 25.9535446244ms
Response time: 22.024679318ms
Response time: 22.4933714233ms
Response time: 7.03038157825ms
Response time: 6.90109826654ms
Response time: 2.90326047379ms
Response time: 25.264461365ms
Response time: 24.6594282983ms

对我来说,这似乎是一个很大的差异,我希望有一些关于如何更好地衡量这一点的建议。5毫秒以下的响应时间也令人惊讶,因为这似乎比我预期的内置键盘解抖时间还要快。在

在.kv文件中:

<TestScreen>:
    id: test_screen
    RelativeLayout:
        id: test_layout
        canvas:
            Color:
                rgba: 0.89,0.75,0.62,1
            Rectangle:
                size: self.size
                pos: self.pos
        CountDownLabel:
            id: count_label
            text: str(self.val)
            color: 0,0,0,1
            font_size: 200
            markup: True
        LeftNumber:
            id: left_number
            text: self.val
            color: 0,0,0,1
            size_hint: .25, .25
            font_size: self.fontval
            pos_hint: {'center_x':0.25,'center_y':0.5}
            markup: True
        RightNumber:
            id: right_number
            text: self.val
            color: 0,0,0,1
            size_hint: .25, .25
            font_size: self.fontval
            pos_hint: {'center_x':0.75, 'center_y':0.5}
            markup: True
        CrossLabel:
            id: cross_label

示例编号类别:

class LeftNumber(Label):
    val = StringProperty('')
    fontval = NumericProperty(100)

Tags: postestselfidnumbersizetimeresponse