2

我们的应用程序使用 glreadpixels 在每一帧上捕获屏幕。在 iOS 5 设备上,当您收到短信(或任何其他通知,我假设)时,应用程序在glreadpixels通话时崩溃。

崩溃只发生在 iOS 5 上,带有新样式的通知(从顶部向下滑动并在不久之后消失的通知)。在 iOS 4 上,旧式UIAlertView通知可以正常工作。

具体来说,调用会glReadPixels()引发EXEC_BAD_ACCESS错误。

具体调用是

glReadPixels(0,0,tx,ty,GL_BGRA_EXT,GL_UNSIGNED_BYTE, buffer);

在哪里

int tx = 482
int ty = 320

(应用程序仅处于横向模式)

GLubyte *buffer = malloc(sizeof(GLubyte)* 4 * tx * ty );

我们还尝试在发出读取命令之前检查帧缓冲区的状态,glCheckFramebufferStatus(GL_FRAMEBUFFER)总是返回GL_FRAMEBUFFER_COMPLETE

这是如何实现新通知弹出的错误吗?我们如何解决它?如果我们能够检测到通知即将出现,并暂停调用glreadpixels直到它消失,那也是可以接受的。

谢谢,

蒂姆

4

1 回答 1

0

在一些罕见的情况下:短信通知,有时当应用程序从后台移动到前台时,glReadPixels() 会以漂亮的 GL_FRAMEBUFFER_COMPLETE 失败

在渲染之前,问题消失在一个很好的旧 glBindFramebuffer 中。从理论上讲,OpenGL 永远不应该“忘记”有界帧缓冲区。奇怪的。

我不确定这是来自苹果还是来自我的代码的错误。但请记住,您的应用与 ios 共享 opengl 上下文。让我们务实一点。我只是添加了神奇的 glBindFramebuffer。

void render() {
    // !! bind Framebuffer, always, even if already bound. Apple bug ?
    glBindFramebuffer(GL_FRAMEBUFFER, m_framebuffer);

    // rendering...

    //end rendering
    //     - glBindRenderbuffer(m_color_renderbuffer); // if required
    //     - glDiscardFramebufferEXT(...)

    // read pixels
    glPixelStorei(GL_PACK_ALIGNMENT, 4);
    glReadPixels(...)
}

        glBindRenderbuffer(GL_RENDERBUFFER, m_color_renderbuffer); 
于 2013-09-01T14:51:52.800 回答