【问题标题】:OpenGL Memory leak with more deletes than allocationsOpenGL内存泄漏,删除多于分配
【发布时间】:2017-11-21 16:00:05
【问题描述】:

有人要求我维护一个不是我编写的库。我有一个应用程序正在执行许多不同的视图。它们可能有不同的尺寸(宽度/高度),它们可能有不同的场景,它们当然是不同的视角。通常代码会去

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 的最佳方式,但查看代码在我看来它应该可以工作。它们是持久的 :) 我看到内存是在设置的视图分辨率中分配的,但是该内存看起来像是被释放了,嗯,几乎无处不在。如果是这样的话....为什么会泄漏?我是否忽略了一些明显的东西?

我已阅读类似措辞的问题,但没有看到答案。我的删除比这里的分配多得多。

【问题讨论】:

  • 您是否尝试过附加一个 OpenGL 调试器(codeXL、nsight)来查看是否真的所有 opengl 对象都被释放了?

标签: opengl memory-leaks


【解决方案1】:

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

但是,您可能是任务管理器的受害者。取自article on CodeProject

首要任务是确认是否存在内存泄漏。许多开发人员使用 Windows 任务管理器来确认应用程序中是否存在内存泄漏。使用任务管理器不仅会产生误导,而且不会提供太多关于内存泄漏位置的信息。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多