PsychoPy - (正在进行的)pyglet内存泄漏的解决方法,影响在帧级别显示的文本组件

时间:2016-06-29 13:55:12

标签: psychopy

我也遇到了臭名昭着的pyglet内存泄漏,这种情况发生在人们需要更新帧级别的文本组件时(文本变量通常在单独的代码组件中计算,也在帧级别)。

泄漏/错误导致正在运行的脚本崩溃并出现以下类型的错误消息:

  File "C:\Program Files (x86)\PsychoPy2\lib\site-packages\psychopy-1.83.04-py2.7.egg\psychopy\visual\window.py", line 541, in flip
        thisStim.draw()

  File "C:\Program Files (x86)\PsychoPy2\lib\site-packages\psychopy-1.83.04-py2.7.egg\psychopy\visual\text.py", line 603, in draw
        self._pygletTextObj.draw()

  File "C:\Program Files (x86)\PsychoPy2\lib\site-packages\pyglet\font\__init__.py", line 565, in draw
        self._layout.draw()

  File "C:\Program Files (x86)\PsychoPy2\lib\site-packages\pyglet\text\layout.py", line 852, in draw
        self.batch.draw()

  File "C:\Program Files (x86)\PsychoPy2\lib\site-packages\pyglet\graphics\__init__.py", line 544, in draw
        func()

  File "C:\Program Files (x86)\PsychoPy2\lib\site-packages\pyglet\graphics\__init__.py", line 476, in <lambda>
        (lambda d, m: lambda: d.draw(m))(domain, mode))

  File "C:\Program Files (x86)\PsychoPy2\lib\site-packages\pyglet\graphics\vertexdomain.py", line 313, in draw
        glDrawArrays(mode, starts[0], sizes[0])

WindowsError: exception: access violation reading 0x00000010
Exception TypeError: "'NoneType' object is not callable" in <bound method Server.__del__ of <pyolib.server.Server object at 0x0EFB3670>> ignored

我知道PsychoPy社区已将此与pyglet中的内存泄漏相关联,该内容泄漏本应于2016年4月根据this线程修复。我downloaded最新版本的Pyglet(v1.2.4 - 显然是在2015年9月发布的,所以在假设的泄漏修复之前)并替换了c:\Program Files (x86)\PsychoPy2\Lib\site-packages\pyglet\下的内容。但是,这并没有解决我的问题。

不幸的是,如果我放弃了提供文本组件的逐帧计算,那么我的实验就没有意义。

我发现较旧的thread建议使用以下解决方法:在代码组件中,逐帧计算显示的文本变量的值,如果新值实际上与此值不同,则仅为此变量赋值以前的值。但是,即使以这种方式更改我的代码组件,仍然会弹出pyglet错误。

假设在Pyglet中修复了错误,是不是v1.2.4反映了此修复,是否应该通过覆盖c:\Program Files (x86)\PsychoPy2\Lib\site-packages\pyglet\的内容来更新(保持原始文件夹结构)?

假设该错误实际上并未在Pyglet中修复,那么有人可以提出一个不同的解决方法,我可以尝试让我的PsychoPy expt不会崩溃吗?

非常感谢你的帮助。

(对于此处和心理组中的双重帖子道歉;一旦对另一方有回应就会更新两个帖子,以避免人们在双重答案上浪费时间)。

1 个答案:

答案 0 :(得分:1)

一种解决方法是使用TextBox而不是TextStim。为此,首先在代码组件中定义一个刺激对象(在“开始例程”下),例如

textbox = visual.TextBox(window=win, 
                         text='Something',
                         font_size=21,
                         font_color=[-1,-1,1], 
                         size=(1.9, .3),
                         pos=(0.0, 0.25), 
                         grid_horz_justification='center',
                         units='norm')

然后,也许在“每一帧”标签下,人们使用代码来定制&amp;使用http://www.psychopy.org/api/visual/textbox.html

上的语法调用如此定义的文本框