OpenGL内存泄漏带有比分配更多的删除



我被要求维护我没有写的库。我有一个正在做许多不同观点的应用程序。它们可能处于不同的大小(宽度/高度),并且可能是不同的场景,并且当然是不同的观点。通常代码

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

在一个过程中,这是多次重复的。

Windows任务管理器显示有内存泄漏。该应用程序是围绕C层设计的,称为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的最佳方法,而是看代码,在我看来它应该起作用。他们坚持不懈:)我看到记忆是在视图的设定分辨率中分配的,但是这种内存看起来像是在释放的,几乎到处都是。如果是这样。...为什么泄漏?我忽略了明显的东西吗?

我已经阅读了类似的措辞问题,但看不到答案。在这里,我的删除量要多得多。

要添加到BDL的评论中,您也可以尝试glintercept以验证删除是否正确发生。即使您不使用Core OpenGL配置文件,此出色的工具也将捕获所有OpenGL调用和工作。

但是,您可能是任务经理的受害者。取自有关CodeProject的本文:

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

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

确保您确认自己确实有泄漏。然后,我建议检查您的应用程序进行的OpenGL呼叫。

最新更新