我正在使用Cython编写一个合成X11窗口管理器。我已经掌握了最重要的部分,但是从pixmaps创建GL纹理给我带来了麻烦。纹理绑定可以正常工作,但是应用程序会很快泄漏内存。
从窗口获取命名的像素图后,使用接受X11 Texture
的函数创建Pixmap
对象。
texture = Texture.create_from_pixmap(pixmap.id, (256, 256))
Texture.create_from_pixmap
调用bindTexImage
,它会从X11 GLXPixmap
创建Pixmap
,将其绑定到纹理,然后返回GLXPixmap
。此GLXPixmap
将保存为Texture
对象实例中的类变量,以便在删除Texture
时释放。
cdef GLXPixmap bindTexImage(Pixmap pixmap):
cdef int *pixmap_attribs = [
GLX_TEXTURE_TARGET_EXT, GLX_TEXTURE_2D_EXT,
GLX_TEXTURE_FORMAT_EXT, GLX_TEXTURE_FORMAT_RGBA_EXT,
0x8000
]
cdef GLXPixmap glxpixmap
glxpixmap = glXCreatePixmap(window_info.display, configs[0], pixmap, pixmap_attribs)
# Commenting out this line fixes the memory leak
glx.glXBindTexImageEXT(window_info.display, glxpixmap, GLX_FRONT_EXT, NULL)
return glxpixmap
cdef void releaseTexImage(GLXPixmap glxpixmap):
glx.glXReleaseTexImageEXT(window_info.display, glxpixmap, GLX_FRONT_EXT)
在调试问题时,我发现删除对glXBindTexImageEXT
的调用修复了内存泄漏,但我还不熟悉OpenGL,GLX和X11以了解内存的位置和原因泄漏。
值得一提的是,我已在bind和release函数中插入了print语句,以验证GLXPixmap
是否正确发布,据我所知,它是
如果相关,可以在此处找到完整的代码:https://github.com/jakogut/kivywm
编辑:重读规范(https://www.khronos.org/registry/OpenGL/extensions/EXT/GLX_EXT_texture_from_pixmap.txt)
我偶然发现了这段似乎相关的内容:
...当GLX像素图不是最新的时,它将被释放 到任何客户端和绑定到纹理对象的所有颜色缓冲区 已被释放。
答案 0 :(得分:1)
正如一位有用的匿名编码员指出的那样,glXDestroyPixmap
的Khronos文档中没有提到glXCreatePixmap
函数。 (https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glXCreatePixmap.xml)
使用此功能释放GLXPixmap后,解决了内存泄漏问题。
编辑:这是修复:cdef void releaseTexImage(GLXPixmap glxpixmap):
glx.glXReleaseTexImageEXT(window_info.display, glxpixmap, GLX_FRONT_EXT)
glXDestroyPixmap(window_info.display, glxpixmap)