Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何解决Python OpenGL内存泄漏问题?_Python_Opengl_Memory Leaks_Pyopengl - Fatal编程技术网

如何解决Python OpenGL内存泄漏问题?

如何解决Python OpenGL内存泄漏问题?,python,opengl,memory-leaks,pyopengl,Python,Opengl,Memory Leaks,Pyopengl,我正试图画一些traingle,并在屏幕上呈现一些文本。但我观察到,内存(RAM)仅在6次draw调用中逐渐增加。我有8GB内存。当我运行程序时,内存使用在1分钟内从4.2变为6。这是完整的代码 从OpenGL.GL导入* 从OpenGL.GLU导入* 从OpenGL.GL导入着色器 从着色器导入* 进口glfw 导入自由类型 进口glm 将numpy作为np导入 从PIL导入图像 输入数学 类字符槽: 定义初始化(自身、纹理、轮廓): self.texture=纹理 self.textureS

我正试图画一些traingle,并在屏幕上呈现一些文本。但我观察到,内存(RAM)仅在6次draw调用中逐渐增加。我有8GB内存。当我运行程序时,内存使用在1分钟内从4.2变为6。这是完整的代码

从OpenGL.GL导入*
从OpenGL.GLU导入*
从OpenGL.GL导入着色器
从着色器导入*
进口glfw
导入自由类型
进口glm
将numpy作为np导入
从PIL导入图像
输入数学
类字符槽:
定义初始化(自身、纹理、轮廓):
self.texture=纹理
self.textureSize=(glyph.bitmap.width,glyph.bitmap.rows)
如果isinstance(glyph,freetype.GlyphSlot):
self.bearing=(glyph.bitmap\u左,glyph.bitmap\u上)
self.advance=glyph.advance.x
elif isinstance(标志符号,freetype.BitmapGlyph):
self.bearing=(glyph.left,glyph.top)
self.advance=无
其他:
引发运行时错误('未知标志符号类型')
定义获取渲染缓冲区(xpos、YPO、w、h、zfix=0.0):
返回np.asarray([
xpos,ypos+h,0,0,
XPO,YPO,0,1,
xpos+w,YPO,1,1,
xpos,ypos+h,0,0,
xpos+w,YPO,1,1,
xpos+w,ypos+h,1,0
],np.32)
def init_chars(着色器程序、窗口高度、窗口宽度、font_size=24、fontfile=“Vera.ttf”):
glUseProgram(着色器程序)
#得到投影
着色器_projection=glGetUniformLocation(着色器程序,“投影”)
W=窗宽
H=窗户高度
投影=垂直投影(-W/2,W/2,-H/2,H/2)
glUniformMatrix4fv(着色器_投影,1,GL_假,glm.value_ptr(投影))
#禁用字节对齐限制
glPixelStorei(GLU解包对齐,1)
face=freetype.face(fontfile)
面部。设置字符大小(字体大小*64)
#加载ASCII集合的前128个字符
Characters=dict()
对于范围内的i(0128):
面荷载(chr(i))
glyph=face.glyph
#生成纹理
纹理=glGenTextures(1)
glBindTexture(GL_纹理_2D,纹理)
glTexImage2D(GL_纹理_2D,0,GL_红色,glyph.bitmap.width,glyph.bitmap.rows,0,
GL_红色,GL_无符号字节,glyph.bitmap.buffer)
#纹理选项
glTexParameteri(GL_纹理\u 2D、GL_纹理\u包裹、GL_夹紧\u到边)
glTexParameteri(GL_纹理\u 2D、GL_纹理\u包裹\u T、GL_夹紧\u到边)
glTexParameteri(GL\u纹理\u 2D、GL\u纹理\u最小\u过滤器、GL\u线性)
glTexParameteri(GL_纹理_2D、GL_纹理_贴图过滤器、GL_线性)
#现在存储字符供以后使用
字符[chr(i)]=字符槽(纹理、字形)
glBindTexture(GL_纹理_2D,0)
glUseProgram(0)
返回字符
def render_文本(窗口、着色器程序、文本、x、y、比例、字符、颜色=(170250255)):
r、 g,b=颜色
glUseProgram(着色器程序)
#为纹理四边形配置VAO/VBO
VAO=GLGEnVertexArray(1)
glBindVertexArray(VAO)
VBO=glGenBuffers(1)
glBindBuffer(GL_数组_缓冲区,VBO)
glBufferData(GLU数组缓冲区,6*4*4,无,GLU静态图)
GlenableVertexAttributeArray(0)
glvertexattributepointer(0,4,GL\u浮点,GL\u假,0,无)
glBindBuffer(GL_数组_缓冲区,0)
glBindVertexArray(0)
glUniform3f(glGetUniformLocation(着色器程序,“textColor”)、r/255、g/255、b/255
玻璃纹理(GL_纹理0)
glBindVertexArray(VAO)
对于文本中的c:
ch=字符[c]
w、 h=ch.textureSize
w=w*刻度
h=h*刻度
顶点=\获取\渲染\缓冲区(x、y、w、h)
#在四边形上渲染轮廓纹理
glBindTexture(GL_纹理_2D,ch.TEXTURE)
#更新VBO内存的内容
glBindBuffer(GL_数组_缓冲区,VBO)
glBufferSubData(GL_数组_缓冲区,0,顶点.n字节,顶点)
glBindBuffer(GL_数组_缓冲区,0)
#渲染四边形
GLDrawArray(GLU三角形,0,6)
#现在为下一个glyph提前游标(注意,提前是1/64像素的数量)
x+=(ch.advance>>6)*比例
glBindTexture(GL_TEXTURE_2D,0);
glUseProgram(0)
#解除绑定并删除VAO/VBO
glBindVertexArray(0)
glBindBuffer(GL_数组_缓冲区,0)
glDeleteBuffers(1,id(VBO))
glDeleteBuffers(1,id(VAO))
def三角形(着色器程序,窗口,x=0,y=0):
顶点=[-0.5,-0.5,0.0,
0.5, -0.5, 0.0,
0.0, 0.5, 0.0]
顶点=np.array(顶点,dtype=np.float32)
VBO=glGenBuffers(1)
glBindBuffer(GL_数组_缓冲区,VBO)
glBufferData(GL\U数组\U缓冲区、顶点.n字节、顶点、GL\U静态\U绘制)
GLVertexAttributePointer(0,3,GL\u浮点,GL\u假,0,无)
GlenableVertexAttributeArray(0)
#使用着色器程序
glUseProgram(着色器程序)
#从着色器程序访问ourColor变量
vertexColorLoc=glGetUniformLocation(着色器程序,“ourColor”)
glUniform4f(vertexColorLoc,255,28/255.0,20/255.0,0.7);
#变换矩阵
变换=glm.mat4(1)
transform=glm.translate(transform,glm.vec3(x,y,0))
MVP=glGetUniformLocation(着色器程序,“MVP”)
glUniformMatrix4fv(MVP,1,GL_FALSE,glm.value_ptr(转换))
#拉丝槽
glLineWidth(3)
GLDrawArray(GLU三角形,0,3)
glUseProgram(0)
#解除绑定并删除VAO/VBO
glBindVertexArray(0)
glBindBuffer(GL_数组_缓冲区,0)
glDeleteBuffers(1,id(VBO))
def main():
glfw.init()
window=glfw.create_window(640640640,“示例程序”,无,无)
glfw.make_context_current(窗口)
#初始化着色器程序
shaderProgram=get_shaderProgram()
text\u shaderProgram=get\u text\u shaderProgram()
#加载字符和VAO/VBO以进行文本渲染
Characters=init_chars(text_shaderProgram,640)
#窗口循环
而不是glfw。窗口应关闭(窗口):
glfw.poll_事件()
#屏风