SMS-уведомление iOS 5 приводит к сбою glreadpixels - PullRequest
2 голосов
/ 29 ноября 2011

Наше приложение использует 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, пока оно не исчезнет, ​​это также будет приемлемо.

Спасибо,

Тим

1 Ответ

0 голосов
/ 01 сентября 2013

В некоторых редких ситуациях: смс-уведомления, иногда, когда приложение перемещается из фона на передний план, glReadPixels () завершается неудачно с прекрасным GL_FRAMEBUFFER_COMPLETE

Проблема исчезает со старым добрым glBindFramebuffer перед рендерингом.Теоретически, OpenGL никогда не должен «забывать» ограниченный кадровый буфер.Странно.

Я не уверен, что это ошибка от Apple или из моего кода.Но помните, что ваше приложение разделяет контекст opengl с ios.Давайте будем прагматичными.Я просто добавляю волшебный 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); 
...