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