Почему моя игра OpenGL ES для iPhone мерцает при первом включении телефона?

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

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

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

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

У кого еще возникла эта проблема?

Ваше здоровье!


person MrDatabase    schedule 16.10.2008    source источник


Ответы (5)


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

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

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

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

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

person Evgen Bodunov    schedule 12.06.2010

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

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

person Mark Bessey    schedule 16.10.2008
comment
FWIW, я только что экспериментировал со своим собственным приложением OpenGL на своем iPhone, и не вижу никаких проблем. - person Kristopher Johnson; 17.10.2008

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

person Medran    schedule 20.01.2010

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

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

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

person Rob Jones    schedule 19.01.2010

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

В моем случае проблема была вызвана тем, что я настраивал контекст в ESRenderer, но на самом деле ничего не рисовал, т.е. в приведенном ниже коде [рисование сцены] ничего не рисовало в определенных состояниях. На старых iPhone и Sim, когда вы ничего не рисуете, кажется, что буферы 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];   
}
person gulchrider    schedule 11.05.2010