iOS 6 OpenGL ES 2.0渲染缓冲区对象中的视频内存泄漏

iOS 6 OpenGL ES 2.0渲染缓冲区对象中的视频内存泄漏,ios,ios6,opengl-es,Ios,Ios6,Opengl Es,下面是一个示例代码,其行为类似于在iPad 2 IOS 6.1上泄漏视频内存(基本上,它创建渲染缓冲区对象,为其分配内存,并在绘制后将其销毁): 如果我把它放到一个draw循环中,我会看到很多内存警告,最后应用程序会被操作系统杀死。仪器没有给出任何提示,我甚至看不到任何内存大小的增长,只有内存警告 我知道在绘制循环中创建缓冲区是个坏主意,但无论如何都需要重新创建缓冲区,以防用户旋转设备和分辨率发生变化,因此泄漏仍将存在,但需要更多时间才能终止应用程序(有时应用程序终止时,springboard也

下面是一个示例代码,其行为类似于在iPad 2 IOS 6.1上泄漏视频内存(基本上,它创建渲染缓冲区对象,为其分配内存,并在绘制后将其销毁):

如果我把它放到一个draw循环中,我会看到很多内存警告,最后应用程序会被操作系统杀死。仪器没有给出任何提示,我甚至看不到任何内存大小的增长,只有内存警告

我知道在绘制循环中创建缓冲区是个坏主意,但无论如何都需要重新创建缓冲区,以防用户旋转设备和分辨率发生变化,因此泄漏仍将存在,但需要更多时间才能终止应用程序(有时应用程序终止时,springboard也会重新启动)

我认为,下面的例子只是一种重现通常隐藏的问题的方法。 我很高兴能在这里提供任何关于这里哪里出了问题以及如何修复这个漏洞的想法

我尝试了几件事(参见注释代码),但都没有真正的帮助。唯一有帮助的是对glClear和glDrawArrays调用进行注释

在这种情况下,GPU似乎没有触及渲染缓冲区,问题消失了,但我需要清除该缓冲区并向其绘制一些内容(我需要该缓冲区的原因如下:

我尝试在纹理中实现多采样渲染,这实际上是可行的,但会泄漏内存)。 我在每次GL调用后检查glGetError(),没有出现错误

GLuint rbo;
glGenRenderbuffers(1, &rbo);
glBindRenderbuffer(GL_RENDERBUFFER, rbo);
//glRenderbufferStorageMultisampleAPPLE(GL_RENDERBUFFER, 4, GL_RGBA4, 2000 , 2000);
glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA4, 2000 , 2000);

/*GLuint fbo_faa;
glGenFramebuffers(1, &fbo_faa);*/
glBindFramebuffer(GL_FRAMEBUFFER, defaultFramebuffer/*fbo_faa*/);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo);

glClearColor(0, 0, 0, 0);
glClear(GL_COLOR_BUFFER_BIT);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, 0);
glDeleteRenderbuffers(1, &rbo);

我现在明白你在做什么了,我不知道你的代码为什么会在我的一个项目中工作。无论如何,似乎您一直在将渲染缓冲区附加到帧缓冲区。最好的猜测是它们不会被删除,因为您没有向GL发出这些渲染缓冲区不再使用的信号。因此,您确实需要放弃附件并重新连接主渲染缓冲区。。尝试粘贴此代码并告诉我结果如何

    GLuint rbo;
    glGenRenderbuffers(1, &rbo);
    glBindRenderbuffer(GL_RENDERBUFFER, rbo);
    //glRenderbufferStorageMultisampleAPPLE(GL_RENDERBUFFER, 4, GL_RGBA4, 2000 , 2000);
    glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA4, 2000 , 2000);

    /*GLuint fbo_faa;
     glGenFramebuffers(1, &fbo_faa);*/
    glBindFramebuffer(GL_FRAMEBUFFER, defaultFramebuffer/*fbo_faa*/);
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo);

    glClearColor(0, 0, 0, 0);
    glClear(GL_COLOR_BUFFER_BIT);
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

    const GLenum discards[]  = {GL_COLOR_ATTACHMENT0};
    glDiscardFramebufferEXT(GL_FRAMEBUFFER, 1, discards);

    glDeleteRenderbuffers(1, &rbo);

    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorRenderbuffer);
    glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer);

我将您的代码粘贴到现有项目的一个主绘制方法中。我尝试将它绑定到我的主帧缓冲区,并尝试创建一个单独的缓冲区。我不能得到任何内存泄漏或任何其他类型的问题。“有可能是其他代码造成的吗?”彼得,很抱歉回复晚了。如果我在[context presentRenderbuffer:GL\u RENDERBUFFER]调用之前将代码放入标准的GLES2Sample ES2Renderer-(void)render方法中,它的行为与上面描述的类似。您是在设备上还是在模拟器上运行的?这是我的输出(正如您从时间戳中看到的,第一个警告在发射后立即出现,而您需要等待一段时间,以便第二个警告出现)…2013-05-17 10:13:34.022 GLES2Sample[2044:907]应用程序启动结束时,应用程序窗口预计会有一个根视图控制器2013-05-17 10:13:35.045 GLES2Sample[2044:907]收到内存警告。2013-05-17 10:14:00.810 GLES2Sample[2044:907]收到内存警告。2013-05-17 10:14:04.026 GLES2Sample[2044:907]收到内存警告。2013-05-17 10:14:04.203 GLES2Sample[2044:907]收到内存警告。正常,工作正常。现在我确信,如果我只在分辨率改变时重新创建缓冲区,就不会有泄漏。但仍然存在一个问题:为什么只有在放弃并附加另一个渲染缓冲区的情况下才会泄漏。例如,如果我放弃并分离所有渲染缓冲区,它仍然会泄漏。。。有什么想法吗?驱动程序中的错误?谢谢你的帮助。顺便说一句,如果我附加了另一个渲染缓冲区,但没有放弃,我仍然会看到两个或三个内存警告,然后停止出现:)因此应用程序可以工作并且永远不会被终止,唯一的问题是这几个警告。这变得越来越有趣:)无论如何,在每次绘制时创建缓冲区是一个非常糟糕的主意:)@peter,我忘了在我的评论中输入你的名字。再次感谢您。经过几分钟的不放弃工作,nexe输出(应用程序仍在运行)。。。2013-05-17 13:21:46.575 GLES2Sample[279:907]应用程序启动结束时,应用程序窗口预计将有一个根视图控制器2013-05-17 13:21:47.947 GLES2Sample[279:907]收到内存警告。2013-05-17 13:21:52.697 GLES2Sample[279:907]收到内存警告。2013-05-17 13:21:52.893 GLES2Sample[279:907]收到内存警告。2013-05-17 13:23:01.032 GLES2Sample[279:907]收到内存警告。2013-05-17 13:28:56.466 GLES2Sample[279:907]收到内存警告。