pyOpenGL GLUT 窗口功能无法正确关闭



这个PyOpenGl和GLUT环境的最小工作示例呈现了我在更大的代码中遇到的相同问题。连续创建/关闭这个类的实例,会增加内存使用,直到我的所有机器开始变慢。

glutDestroyWindow的调用没有效果,进程/usr/lib/xorg/Xorg很快填满了整个GPU。

from OpenGL.GLUT import *
DISPLAY_WIDTH, DISPLAY_HEIGHT = 2000, 2000
class TestEnv:
def __init__(self):
self.window = None
glutInit(sys.argv)
glutInitWindowSize(DISPLAY_WIDTH, DISPLAY_HEIGHT)
self.window = glutCreateWindow(b"TestEnv")
def close(self):
if self.window:
glutDestroyWindow(self.window)
if __name__ == "__main__":
i = 0
while True:
env = TestEnv()
env.close()
print(i)
i+=1

释放所有资源的正确方法是什么?

PyOpenGL使用freeglut。你必须给freeglut一个关闭窗口的机会。glutDestroyWindow不会立即破坏窗口,但会触发一个破坏窗口的事件。因为你必须运行事件循环。在请求销毁窗口后调用glutMainLoopEvent:

from OpenGL.GLUT import *
DISPLAY_WIDTH, DISPLAY_HEIGHT = 2000, 2000
class TestEnv:
def __init__(self):
self.window = None
glutInit(sys.argv)
glutInitWindowSize(DISPLAY_WIDTH, DISPLAY_HEIGHT)
self.window = glutCreateWindow(b"TestEnv")
def close(self):
if self.window:
glutDestroyWindow(self.window)
if __name__ == "__main__":
i = 0
while True:
env = TestEnv()
env.close()
glutMainLoopEvent() # <--- handle events
print(i)
i += 1

参见即时模式和传统OpenGL

最新更新