考虑以下test code:
for (int i = 0; i < 100; ++i) {
GLuint fboid = 0;
GLuint colortex = 0;
GLuint depthtex = 0;
// create framebuffer & textures
glGenFramebuffers(1, &fboid);
glGenTextures(1, &colortex);
glGenTextures(1, &depthtex);
glBindTexture(GL_TEXTURE_2D, colortex);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 4000, 4000, 0, GL_BGRA, GL_UNSIGNED_BYTE, 0);
glBindTexture(GL_TEXTURE_2D, depthtex);
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8, 4000, 4000, 0, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, 0);
glBindFramebuffer(GL_FRAMEBUFFER, fboid);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colortex, 0);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D, depthtex, 0);
assert(GL_FRAMEBUFFER_COMPLETE == glCheckFramebufferStatus(GL_FRAMEBUFFER));
// clear it
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);
// delete everything
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glBindTexture(GL_TEXTURE_2D, 0);
glDeleteFramebuffers(1, &fboid);
glDeleteTextures(1, &colortex);
glDeleteTextures(1, &depthtex);
}
// put breakpoint here
您将在活动监视器中看到&#34; Memory used&#34;在底部变得天高(14 GB)。好像GPU仍在引用已发布的纹理。
我尝试了以下内容:
这些都没有任何影响。 但是(!)如果我删除了glClear()调用,则问题就会消失。
可能是什么原因引起的?它在Windows上也是可重复的,而与另一个实现(不幸的是我无法分享,而且反正更复杂)。
有没有人看到像这样的内存泄漏问题?
UPDATE :现在很明显,深度/模板缓冲区正在泄漏。如果我创建一个仅限深度的附件,那么问题就会再次消失!
更新:使用英特尔卡更容易重现。在我2011年末的mbpro上,代码在使用分立卡(Radeon 6750M)时运行良好,但是使用集成卡(HD 3000)产生了所描述的泄漏。
更新:已在High Sierra(10.13.x)上修复
答案 0 :(得分:0)
虽然我没有找到任何合适的解决方案,但我想出了一个解决方法(不幸的是,它带来了与Radeon Pro 580(?)卡不同的泄漏问题)。
解决方法如下:
通过这个解决方案,我设法最大限度地减少了上述配置的泄漏... aaaaaaa并把它搞砸了AMD卡(我认为这是另一种驱动程序错误,但是现在我不能用它来复制它一个小程序。)