python - Pyopengl glReadPixels 导致内存泄漏
问题描述
所以我正在开发一个 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 链接。
解决方案
推荐阅读
- openedge - 将 FOR EACH 中的行添加到 TEMP-TABLE
- swift - FCM 适用于 Firebase v3.4.1,但不适用于 v5.8.1
- ffmpeg - Crop, Resize and Cut all in one command - FFMPEG
- amazon-web-services - How to set DHCP Options Set via AWS SDK
- c++ - LNK1104 无法打开文件“libboost_filesystem-vc141-mt-gd-x32-1_68.lib”
- javascript - 如何解决此错误“SyntaxError: Unexpected token < in JSON at position 0”
- python - 为什么 Python 比较运算符显示不同的结果?
- amazon-web-services - 如何强制 CodeBuild (AWS) 失败?
- ios - 在发布新的应用程序更新时,如何从 iTunesConnect 中的先前版本复制“此版本中的新增功能”元数据?
- python - Keras 时间序列:在 LSTM 中包含静态和动态变量的建议