我们的应用程序使用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
(app仅处于横向模式)
和
GLubyte *buffer = malloc(sizeof(GLubyte)* 4 * tx * ty );
我们还尝试在发出读取命令之前检查帧缓冲区的状态,glCheckFramebufferStatus(GL_FRAMEBUFFER)
始终返回GL_FRAMEBUFFER_COMPLETE
。
这是如何实现新通知弹出的错误吗?我们如何解决这个问题?如果我们能够检测到通知即将出现,并暂停对glreadpixels
的呼叫,直到它消失,那也是可以接受的。
谢谢,
添
答案 0 :(得分: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);