0

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

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

我知道在绘制循环中创建缓冲区是一个坏主意,但是无论如何都需要重新创建缓冲区,以防用户旋转设备并且分辨率发生变化,因此泄漏仍然存在但需要更多时间来杀死应用程序(也看起来像跳板有时会在应用程序被终止时重新启动)。

因此,我认为下面的示例只是重现通常隐藏的问题的一种方法。我很乐意在这里提出任何关于这里出了什么问题以及如何修复此泄漏的想法。

我尝试了几件事(请参阅注释代码),但没有任何帮助。唯一有用的是注释 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);
4

1 回答 1

0

我现在看到你在做什么,但我不知道为什么你的代码在我的一个项目中有效。无论如何,您似乎一直将渲染缓冲区附加到帧缓冲区。最好的猜测是它们不会被删除,因为您没有向 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);
于 2013-05-17T07:40:55.130 回答