时间问题 Psychopy PyGaze EyeTribe Eyetracker(多线程)

Timing issues Psychopy PyGaze EyeTribe Eyetracker (Multithreading)

我有一个实验,其中我使用 PsychoPy / PyGaze 呈现刺激并使用 EyeTribe 眼动仪跟踪眼球运动。在这个实验中,我更新了每帧(60 赫兹)上两个视觉刺激的大小。我事先准备好每一帧,然后循环遍历所有屏幕对象并呈现它们。与此同时,连续不断的声音响起。当我 运行 在虚拟模式下进行这个实验时(鼠标移动被用作注视位置的模拟),视觉呈现没有时间问题。然而,当我 运行 在进行眼动追踪的实验时,视觉呈现的时间不再准确(帧持续时间的可变性更高)。

我尝试更多地研究多线程,但在 PyGaze 的 pytribe 脚本中我找不到任何证据表明一个线程正在等待来自眼动追踪线程的事件。所以,我不知道如何找出导致时间问题的原因或如何解决这个问题? (我希望我对问题的解释足够具体)。

这比只需要一个单独的线程来进行眼动追踪和刺激渲染更糟糕。您真正需要的是一个单独的 进程 来避免 python 全局解释器锁 (GIL)。 GIL 防止不同的线程在不同的处理器上 运行ning。

为了提高时间精度,我真的建议您从 pygaze 切换到 iohub(我相信它也支持 eyetribe)。 iohub 确实 运行 真正地在机器的不同核心上运行,这样您的刺激和眼睛数据就可以及时独立处理,并为您处理所有同步内容。

添加到 Jon 的回答中:Hanne 也通过电子邮件发送了有关该问题的信息,结果证明她 运行 从 Spyder 进行实验。当在命令提示符下 运行 时,不应该有任何计时问题。 (显然,GIL 仍然存在,但实际上这似乎不会影响屏幕时序。)

为了防止将来出现任何问题,我添加了一个 class 允许 运行 在并行过程中使用 EyeTribe。参见:https://github.com/esdalmaijer/PyTribe/blob/master/pytribe.py#L365

使用示例:

if __name__ == "__main__":

    from pygaze.display import Display
    from pygaze.screen import Screen
    from pytribe import ParallelEyeTribe

    disp = Display()

    scr = Screen()
    scr.draw_fixation(fixtype='cross')

    tracker = ParallelEyeTribe()


    tracker.start_recording()

    disp.fill(scr)
    disp.show()
    tracker.log("Stimulus onset")

    time.sleep(10)

    disp.show()
    tracker.log("Stimulus offset")
    tracker.stop_recording()

    tracker.close()
    disp.close()