请看以下测试代码:
在活动监视器中,您会看到底部的“已使用内存”飙升(14 GB)。就好像GPU仍在引用已经释放的纹理一样。我尝试了以下操作:调用各种位置的glFlush();调用各种位置的glFinish();更改纹理/帧缓冲对象删除的顺序;在删除之前从帧缓冲对象中分离附件;调用[context flushBuffer()];但是这些都没有任何效果。然而,如果我删除glClear()调用,问题就消失了。可能是什么原因导致的呢?这个问题也可以在Windows上重现,并且在另一个实现中也可以重现(不幸的是我无法分享,而且它本身更加复杂)。你们有没有见过类似的内存泄漏问题?更新:现在很明显,深度/模板缓冲正在泄漏。如果我创建一个仅深度的附件,那么问题又消失了!更新:使用英特尔显卡更容易重现。在我晚期2011年的mbpro上,代码在独立显卡(Radeon 6750M)上运行良好,但在集成显卡(HD 3000)上产生了所述的泄漏。更新:它已经在High Sierra(10.13.x)上修复了。
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
在活动监视器中,您会看到底部的“已使用内存”飙升(14 GB)。就好像GPU仍在引用已经释放的纹理一样。我尝试了以下操作:调用各种位置的glFlush();调用各种位置的glFinish();更改纹理/帧缓冲对象删除的顺序;在删除之前从帧缓冲对象中分离附件;调用[context flushBuffer()];但是这些都没有任何效果。然而,如果我删除glClear()调用,问题就消失了。可能是什么原因导致的呢?这个问题也可以在Windows上重现,并且在另一个实现中也可以重现(不幸的是我无法分享,而且它本身更加复杂)。你们有没有见过类似的内存泄漏问题?更新:现在很明显,深度/模板缓冲正在泄漏。如果我创建一个仅深度的附件,那么问题又消失了!更新:使用英特尔显卡更容易重现。在我晚期2011年的mbpro上,代码在独立显卡(Radeon 6750M)上运行良好,但在集成显卡(HD 3000)上产生了所述的泄漏。更新:它已经在High Sierra(10.13.x)上修复了。
iMac Retina 4K,21.5英寸,2017年Radeon Pro 555 2 GB; iMac(21.5英寸,2012年末)NVIDIA GeForce GT 640M 512 MB; iMac(4K Retina,2015年末)Radeon Pro 555 2 GB; iMac 2013英特尔酷睿pro;
关于initWithCoder:我不这么认为,因为我们在一个简单的单元测试中也遇到了这个问题。 - Asylum