我也遇到了臭名昭着的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不会崩溃吗?
非常感谢你的帮助。
(对于此处和心理组中的双重帖子道歉;一旦对另一方有回应就会更新两个帖子,以避免人们在双重答案上浪费时间)。
答案 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
上的语法调用如此定义的文本框