Opengl es iOS 5短信通知导致glreadpixels崩溃

Opengl es iOS 5短信通知导致glreadpixels崩溃,opengl-es,opengl-es-2.0,glreadpixels,ios5,Opengl Es,Opengl Es 2.0,Glreadpixels,Ios5,我们的应用程序使用glreadpixels捕捉每一帧的屏幕。在iOS 5设备上,当您收到文本消息(或任何其他通知,我假定)时,应用程序会在glreadpixels调用时崩溃 只有在iOS5上使用了新的通知样式(从顶部滑下并很快消失的通知),才会发生崩溃。在iOS 4上,旧的UIAlertView样式的通知工作正常 具体来说,调用glReadPixels()会抛出一个EXEC\u BAD\u ACCESS错误 具体电话是 glReadPixels(0,0,tx,ty,GL_BGRA_EXT,GL_

我们的应用程序使用glreadpixels捕捉每一帧的屏幕。在iOS 5设备上,当您收到文本消息(或任何其他通知,我假定)时,应用程序会在
glreadpixels
调用时崩溃

只有在iOS5上使用了新的通知样式(从顶部滑下并很快消失的通知),才会发生崩溃。在iOS 4上,旧的
UIAlertView
样式的通知工作正常

具体来说,调用
glReadPixels()
会抛出一个
EXEC\u BAD\u ACCESS
错误

具体电话是

glReadPixels(0,0,tx,ty,GL_BGRA_EXT,GL_UNSIGNED_BYTE, buffer);
在哪里

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

我们还尝试在发出读取命令之前检查帧缓冲区的状态,
glCheckFramebufferStatus(GL\u FRAMEBUFFER)
始终返回
GL\u FRAMEBUFFER\u COMPLETE

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

谢谢


Tim

在一些罕见的情况下:短信通知,有时当应用程序从后台移动到前台时,glReadPixels()会失败,并完成一个漂亮的GL\u帧缓冲区

在渲染之前,使用一个好的旧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); 

在一些罕见的情况下:短信通知,有时当应用程序从后台移动到前台时,glReadPixels()会失败并完成一个漂亮的GL\u FRAMEBUFFER\u

在渲染之前,使用一个好的旧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); 
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);