【发布时间】: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