0

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

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

4

2 回答 2

1

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

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

于 2016-06-15T15:17:10.403 回答
1

补充 Jon 的答案:Hanne 还通过电子邮件发送了有关该问题的电子邮件,事实证明她正在从 Spyder 运行她的实验。从命令提示符运行时,不应该有任何时间问题。(显然,GIL 仍然存在,但实际上这似乎不会影响屏幕计时。)

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

示例使用:

如果 __name__ == "__main__":

    从 pygaze.display 导入显示
    从 pygaze.screen 导入屏幕
    从 pytribe 导入 ParallelEyeTribe

    显示 = 显示()

    scr = 屏幕()
    scr.draw_fixation(fixtype='cross')

    跟踪器 = ParallelEyeTribe()


    tracker.start_recording()

    disp.fill(scr)
    显示()
    tracker.log("刺激开始")

    时间.sleep(10)

    显示()
    tracker.log("刺激偏移")
    tracker.stop_recording()

    跟踪器.close()
    显示.close()
于 2016-08-02T15:33:25.670 回答