OpenGL内存泄漏,删除次数多于分配

时间:2017-11-21 16:00:06

标签: opengl memory-leaks

我被要求维护一个我没写过的图书馆。我有一个应用程序正在做许多不同的视图。它们可以是不同的尺寸(宽度/高度),它们可以是不同的场景,它们当然是不同的视角。通常代码

initialize view
set resolution of view 
do stuff to view
clear view

在一个过程中重复几次。

Windows任务管理器显示存在内存泄漏。该应用程序是围绕一个C层设计的,该C层调用一个名为render的C ++对象。 **中的代码表示C层。所有其他都在对象内。

初始化新视图看起来像

**if there is an old render delete it.**
{
    glDeleteVertexArrays(1, &this->vao);

    glDeleteBuffers(1, &this->positionBuffer);
    glDeleteBuffers(1, &this->fbo);
    glDeleteBuffers(1, &this->rbo);
    glDeleteBuffers(1, &this->ibo);
    glDeleteBuffers(1, &this->dbo);    
}       

**Create new render**
this->rbo = NULL;
this->fbo = NULL;
this->ibo = NULL;
this->dbo = NULL;
initialize this render's scalars.

设置视图分辨率

glDeleteBuffers(1, &this->rbo);
glDeleteBuffers(1, &this->fbo);
glDeleteBuffers(1, &this->dbo);

glGenRenderbuffers(1, &this->rbo);
glBindRenderbuffer(GL_RENDERBUFFER, this->rbo);
glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA32F, width, height);
glBindRenderbuffer(GL_RENDERBUFFER, 0);
error check

glGenRenderbuffers(1, &this->dbo);
glBindRenderbuffer(GL_RENDERBUFFER, this->dbo);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT32F, width, height);
glBindRenderbuffer(GL_RENDERBUFFER, 0);
error check

glGenFramebuffers(1, &this->fbo);
glBindFramebuffer(GL_FRAMEBUFFER, this->fbo);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, this->rbo);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, this->dbo);
error check

和清晰的视图看起来像

glDeleteVertexArrays(1, &this->vao);

glDeleteBuffers(1, &this->positionBuffer);
glDeleteBuffers(1, &this->fbo);
glDeleteBuffers(1, &this->rbo);
glDeleteBuffers(1, &this->ibo);
glDeleteBuffers(1, &this->dbo);

阅读表明这不是使用GPU的最佳方式,但在我看来它应该有效。他们是持久性的:)我看到内存被分配在视图的设置分辨率中,但是内存看起来像它被释放,好吧,几乎无处不在。如果是这样的话......为什么泄漏?我忽略了一些明显的东西吗?

我已经阅读了类似措辞的问题,但没有看到答案。我在此处获得的删除次数远多于分配。

1 个答案:

答案 0 :(得分:0)

要添加到BDL的评论,您还可以尝试GLIntercept来验证删除是否正确发生。即使您没有使用核心OpenGL配置文件,这个出色的工具也可以捕获所有OpenGL调用并工作。

然而,您可能是任务管理员的受害者。取自article on CodeProject

  

首要任务是确认存在内存泄漏。许多开发人员使用Windows任务管理器来确认应用程序中是否存在内存泄漏。使用任务管理器不仅具有误导性,而且还没有提供有关内存泄漏位置的大量信息。

     

首先让我们试着了解任务管理器内存信息是如何误导的。任务管理器显示工作集内存,而不是实际使用的内存。那是什么意思呢?此内存是已分配的内存,而不是已用内存。进一步补充,工作集中的一些内存可以由其他进程/应用程序共享。

确保您确认自己确实有泄漏。然后我建议检查你的应用程序发出的OpenGL调用。