Pyopengl glReadPixels вызывает утечку памяти - PullRequest
0 голосов
/ 03 июля 2018

, поэтому я работаю над программой на 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 вызывает функцию initialize. Этот код работает отлично, за исключением одной вещи: после примерно 40 итераций использование памяти сходит с ума. к каждой итерации добавляется около 50-100 мегабайт (как видно из моего системного монитора), пока в какой-то момент я не использую весь свой оперативной памяти. Поэтому я начал проводить тестирование, комментируя код и т. Д. Проблема, похоже, заключается в вызове glReadPixels (). Когда это закомментировано, программа не съедает все больше и больше памяти. Кто-нибудь знает альтернативу, исправление или хорошую стратегию, чтобы исправить это? Я действительно понятия не имею, что я могу сделать, чтобы это не произошло. Если вы хотите проверить код самостоятельно, я также могу опубликовать ссылку на github.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...