c ++ Opengl,Win内存泄漏

Posted

技术标签:

【中文标题】c ++ Opengl,Win内存泄漏【英文标题】:c++ Opengl, Win memory leak 【发布时间】:2015-04-16 16:04:39 【问题描述】:

我在 Windows 7 上使用 WIN api 创建了一个简单的 opengl 程序。

我已经按照 MSDN win api 网站上的教程设置了窗口。 该窗口运行良好,即使有输入日志,它也不会泄漏任何内存并且工作正常,内存保持在 1.7 MB。

使用 opengl 上下文需要 11MB。

如果我想绘制类似 Rectangle 的东西,它会开始泄漏 200 kb。 (矩形画得非常好……)

它从 14.5 MB 开始,增长到 50MB 并继续。

整个程序没有“new”关键字,是一个非常简单的程序。只创建窗口。比完成渲染的while循环...

这里是主要的。

int main()


    Window wind(800,600);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    while(!wind.isCloseRequested())
    
       glClear(GL_COLOR_BUFFER_BIT);
       glLoadIdentity();

       Vector3f Vertices[3];
       Vertices[0] = Vector3f(-1.0f, -1.0f, 0.0f);
       Vertices[1] = Vector3f(1.0f, -1.0f, 0.0f);
       Vertices[2] = Vector3f(0.0f, 1.0f, 0.0f);

       GLuint VBO;
       glGenBuffers(1, &VBO);
       glBindBuffer(GL_ARRAY_BUFFER, VBO);
       glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW);

       glEnableVertexAttribArray(0);
       glBindBuffer(GL_ARRAY_BUFFER, VBO);
       glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);

       glDrawArrays(GL_TRIANGLES, 0, 3);

       glDisableVertexAttribArray(0);
       wind.update();
       Sleep(16);
   
   wind.Destroy();

   return 0;

【问题讨论】:

【参考方案1】:

glGenBuffers(1, &VBO); 造成内存泄漏。您需要一次创建缓冲区并使用它或每次使用 glDeleteBuffers 销毁缓冲区

顺便说一句,在使用任何 OpenGL 函数之前,我建议阅读文档。许多 OpenGL 函数在内存或 GPU 资源中分配一些内部缓冲区,需要调用 delete/destroy。

【讨论】:

好吧,谢谢你,我一直在错误的地方寻找问题...... 8 kb 泄漏会在一段时间后停止......我想这很正常......我发疯了,在别处寻找问题。非常感谢你。现在保持稳定在 16MB :) 如果你重用一个VBO并且顶点数据没有改变,也不需要每次迭代都调用glBufferData和其他一些函数 如果一切正常,这只是一个测试代码......这些函数调用将进入类,然后它将被优化和更改:) 但是谢谢,你为我节省了一整天的时间来寻找问题出在错误的地方。

以上是关于c ++ Opengl,Win内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL VBO 内存泄漏

OpenGL 纹理映射内存泄漏

OpenGL 帧缓冲附件泄漏 GPU 内存

线程关闭期间Win64 Delphi RTL中的内存泄漏?

默认 Win32 项目具有恒定数量的内存泄漏

彻底搞清楚内存泄漏的原因,如何避免内存泄漏,如何定位内存泄漏