PsychoPy - 影响帧级显示的文本组件的(仍在进行中的)pyglet 内存泄漏的解决方法
PsychoPy - Workaround for (still ongoing) pyglet memory leak affecting text components displayed at frame-level
我也遇到过 运行 臭名昭著的 pyglet 内存泄漏,当需要在帧级别更新文本组件时会发生这种情况(文本变量通常在单独的代码组件中计算,也在帧级别).
leak/bug 使 运行ning 脚本崩溃并出现如下错误消息:
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 中的内存泄漏联系起来,根据 this thread. I downloaded 最新版本的 Pyglet(v1.2.4 - 显然已发布),该内存泄漏本应在 2016 年 4 月左右修复2015 年 9 月,所以在所谓的泄漏修复之前)并替换了 c:\Program Files (x86)\PsychoPy2\Lib\site-packages\pyglet\
下的内容。但是,这并没有解决我的问题。
不幸的是,如果我放弃提供文本组件的逐帧计算,我的实验就没有意义。
我发现一个较旧的 thread 提出了以下解决方法:在按帧计算显示的文本变量值的代码组件中,只有在该新值实际存在时才为该变量分配一个新值与之前的值不同。但是,即使以这种方式更改我的代码组件后,pyglet 错误仍然弹出。
假设这个bug在Pyglet中被修复了,难道不是v1.2.4反映了这个修复,难道不应该通过覆盖c:\Program Files (x86)\PsychoPy2\Lib\site-packages\pyglet\
的内容来更新(保持原来的文件夹结构)吗?
假设这个错误实际上并没有在 Pyglet 中修复,谁能建议一个不同的解决方法,我可以尝试让我的 PsychoPy expt 不崩溃?
非常感谢您的帮助。
(对这里和心理小组的双重 post 表示歉意;一旦对方有回应,我们将立即更新两个线程,以避免人们浪费时间重复回答)。
一种解决方法是使用 TextBox 而不是 TextStim。为此,首先在代码组件("begin routine"下)定义一个刺激对象,例如
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')
然后,也许在 "every frame" 选项卡下,使用代码自定义和调用如此定义的文本框,语法如 http://www.psychopy.org/api/visual/textbox.html
我也遇到过 运行 臭名昭著的 pyglet 内存泄漏,当需要在帧级别更新文本组件时会发生这种情况(文本变量通常在单独的代码组件中计算,也在帧级别).
leak/bug 使 运行ning 脚本崩溃并出现如下错误消息:
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 中的内存泄漏联系起来,根据 this thread. I downloaded 最新版本的 Pyglet(v1.2.4 - 显然已发布),该内存泄漏本应在 2016 年 4 月左右修复2015 年 9 月,所以在所谓的泄漏修复之前)并替换了 c:\Program Files (x86)\PsychoPy2\Lib\site-packages\pyglet\
下的内容。但是,这并没有解决我的问题。
不幸的是,如果我放弃提供文本组件的逐帧计算,我的实验就没有意义。
我发现一个较旧的 thread 提出了以下解决方法:在按帧计算显示的文本变量值的代码组件中,只有在该新值实际存在时才为该变量分配一个新值与之前的值不同。但是,即使以这种方式更改我的代码组件后,pyglet 错误仍然弹出。
假设这个bug在Pyglet中被修复了,难道不是v1.2.4反映了这个修复,难道不应该通过覆盖c:\Program Files (x86)\PsychoPy2\Lib\site-packages\pyglet\
的内容来更新(保持原来的文件夹结构)吗?
假设这个错误实际上并没有在 Pyglet 中修复,谁能建议一个不同的解决方法,我可以尝试让我的 PsychoPy expt 不崩溃?
非常感谢您的帮助。
(对这里和心理小组的双重 post 表示歉意;一旦对方有回应,我们将立即更新两个线程,以避免人们浪费时间重复回答)。
一种解决方法是使用 TextBox 而不是 TextStim。为此,首先在代码组件("begin routine"下)定义一个刺激对象,例如
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')
然后,也许在 "every frame" 选项卡下,使用代码自定义和调用如此定义的文本框,语法如 http://www.psychopy.org/api/visual/textbox.html