【问题标题】:pyOpenGL GLUT window function doesn't close properlypyOpenGL GLUT 窗口功能无法正确关闭
【发布时间】:2021-06-03 18:23:09
【问题描述】:

这个带有 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

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

【问题讨论】:

  • 我没有使用glut,但是看起来你是在释放window实例,而不是glutInit(sys.argv)占用的内存?也许从某种 glutDone() 浏览 glut 文档?

标签: python opengl glut pyopengl freeglut


【解决方案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

另见Immediate mode and legacy OpenGL

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 2015-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多