Почему моя игра OpenGL ES iPhone мерцает, когда я впервые включаю телефон? - PullRequest
3 голосов
/ 17 октября 2008

Я сделал простую игру для iPhone, используя OpenGL ES. Все отлично работает, кроме этой проблемы:

Я полностью выключаю телефон, затем снова включаю, затем запускаю свое приложение, и я получаю это странное мерцание! Любой другой кадр правильный ... неправильные кадры - это снова и снова один и тот же кадр. Если я выйду из приложения, запустите его снова, все в порядке. Если я выхожу и перезагружаюсь 10 раз подряд, все будет хорошо каждый раз.

Но если я выключаю телефон, затем снова включаю его, затем запускаю приложение, которое вызывает то же мерцание при первом запуске приложения.

Почему это происходит?!

Кто-нибудь еще имел эту проблему?

Ура!

Ответы [ 5 ]

3 голосов
/ 12 июня 2010

Apple опубликовала дополнительную информацию об этой проблеме:

В: Мое приложение OpenGL ES мерцает. Особенно при работе на iPhone 3GS, мерцание, кажется, происходит каждый Рамка. Как мне решить эту проблему?

A: по умолчанию содержимое renderbuffer становится недействительным после представляется на экран (по телефону -EAGLContext / presentRenderbuffer :). Ваша заявка должна полностью перерисовать содержимое renderbuffer каждый раз, когда вы рисуете кадр, в противном случае вы можете наблюдать мерцание или другое неожиданное Результаты.

Вы должны предоставить цвет каждому пиксель на экране. В начале вашего кода рисования, это хорошо Идея использовать glClear () для инициализации цветной буфер. Полный экран ясно каждого вашего цвета, глубины и трафаретные буферы (если вы их используете) в начале кадра также может как правило, улучшить ваши приложения производительность.

Если ваше приложение необходимо сохранить растяжимое содержимое между кадрами, Вы можете добавить опцию kEAGLDrawablePropertyRetainedBacking = ДА вашему объекту CAEAGLLayer свойство drawableProperties. С помощью эта опция требует дополнительной памяти и может уменьшить ваши приложения производительность.

1 голос
/ 11 мая 2010

У меня была такая же проблема с миганием / мерцанием, чередующимся между текущим изображением и фиксированным изображением ... это происходило на 3GS, но не на 3G, первом поколении или на симуляторе.

В моем случае проблема была вызвана тем, что я настраивал контекст в ESRenderer, но фактически ничего не рисовал, т. Е. В коде ниже [scene draw] ничего не рисовал в определенных состояниях. На старых iPhone и симе, когда вы ничего не рисуете, похоже, что он не переворачивает буферы OpenGL ... но на 3GS это происходит. В любом случае, мой обходной путь должен был останавливать анимацию в тех состояниях (то есть останавливать таймер, который вызывает режим рисования), когда я ничего не рисовал.

- (void) draw
{
   [EAGLContext setCurrentContext:context]; 
   glBindFramebufferOES(GL_FRAMEBUFFER_OES, defaultFramebuffer);
   glViewport(0, 0, backingWidth, backingHeight);

   //Render the GLScene...
   [scene draw];

   glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorRenderbuffer);
   [context presentRenderbuffer:GL_RENDERBUFFER_OES];   
}
1 голос
/ 19 января 2010

Возможно ли, что вы вызываете glRenderBuffer () и отправляете сообщение presentRenderBuffer в свой EAGLContext без каких-либо обновлений OpenGL, то есть без новых glDrawElements или glDrawArrays. Если вы сделаете это без kEAGLDrawablePropertyRetainedBacking, установленным в YES, то вы можете получить раздражающее мерцание.

Посмотрите kEAGLDrawablePropertyRetainedBacking на свойстве drawableProperties вашего CAEAGLLayer. Это свойство определяет поведение отрисовываемой поверхности после отображения ее содержимого. Если для этого свойства установлено значение NO, содержимое не сохраняется и поэтому не гарантируется, что оно останется неизменным после отображения. Если вы установите его в YES, то содержимое будет сохранено и останется неизменным после отображения.

Я полагаю, что установка kEAGLDrawablePropertyRetainedBacking в YES замаскирует проблему, но не устранит ее.

1 голос
/ 20 января 2010

Я полагаю, что эта проблема связана с повреждением буфера вершин, которое возникает, когда ОС iphone берет на себя управление приложением (блокировка и возобновление, или всплывающее предупреждение). У меня также есть эта проблема, но я не нашел подходящего решения, кажется, это один или несколько объектов в сцене. Мы используем текстурный атлас, и ни один из других объектов, которые разделяют текстуру, кажется, не затронут. Возможно, уничтожение и воссоздание ваших вершинных буферов решит проблему.

1 голос
/ 17 октября 2008

Хм. Я не так много сделал с OpenGL на iPhone, но должен сказать, что я не заметил такого поведения с другими приложениями. Я подозреваю, что это как-то связано с тем, как вы переключаете активные кадровые буферы.

Может быть, посмотрите на пример кода и посмотрите, что вы делаете по-другому?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...