Pyopengl glReadPixels导致内存泄漏

时间:2018-07-03 10:05:58

标签: python memory-leaks python-imaging-library pyopengl

所以我正在研究一个python程序,在其中设置了要绘制到的(屏幕外)窗口,然后每次迭代都更新内容,并使用glReadPixels将窗口上的内容转换为PNG图像。

from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
from PIL import Image,ImageDraw,ImageOps

class someclass:
    initialized = False

    def initialize(self):
        glutInit(sys.argv)

        glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB)
        glutInitWindowSize(self.width, self.height)
        glutCreateWindow(b"OpenGL Offscreen")
        glutHideWindow()
        self.initialized = True

    def new_frame(self):
        if not self.initialized:
            self.initialize()

        glClearColor(*(self.background.getfloat()), 1.0)
        glColor(0.0, 1.0, 0.0)
        gluOrtho2D(-1.0, 1.0, -1.0, 1.0)
        glViewport(0, 0, self.width, self.height)

        glClear(GL_COLOR_BUFFER_BIT)
        self.handlers(None)
        glFlush()

        glPixelStorei(GL_PACK_ALIGNMENT, 1)

        data = glReadPixels(0, 0, self.width, self.height, GL_RGBA, GL_UNSIGNED_BYTE)

        currentimage = Image.frombytes("RGBA", (self.width, self.height), data)
        currentimage = ImageOps.flip(currentimage)
        currentimage.convert('RGB').resize((self.width//self.scale,self.height//self.scale), Image.ANTIALIAS).save("something.png","PNG")

每次交互都会调用new_frame()函数。 new_frame函数第一次调用初始化函数。这段代码除了以下几点外,效果很好:大约40次迭代后,内存使用变得疯狂了。每次迭代都会增加大约50-100 mb(由我的系统监视器看到),直到某个时候我使用了我的所有ram。因此,我开始通过注释掉代码等方式进行一些测试。问题似乎出在对glReadPixels()的调用上。当它被注释掉时,程序不会消耗越来越多的内存。有谁知道替代品,修复程序或解决方案的好策略?我真的不知道该怎么做才能阻止它的发生。如果您想自己测试一下代码,我也可以发布github链接。

0 个答案:

没有答案