2014-12-08 3 views
0

Приложение использует OpenGL ES2 и структуру GLKit, а также цикл рендеринга/обновления, предоставляемый GLKitViewController. Раньше он работал со скоростью 60 кадров в секунду на моем iPad2 с iOS7.1, но как только я обновил iPad2 до iOS8.1, точно такой же код теперь колеблется между 56-59 FPS. (CPU utlitization, однако, по-прежнему остается на уровне 40-60%).Частота кадров приложения OpenGL ухудшилась после обновления с iOS7.1 до iOS8.1

Профилирование показывает, что команды рисования OpenGL используют гораздо большую долю времени процессора, чем раньше. Самым большим изменением является то, что призывы к «GLKBaseEffect prepareToDraw» занимают гораздо больше времени, чем раньше.

(Приложение использует один GLKBaseEffect, который переконфигурируется в разных точках цикла рендеринга, каждый раз требуя вызова для подготовкиToDraw. Я понимаю, что можно оптимизировать, имея несколько экземпляров GLKBaseEffect, и это то, что я рассматривал на более позднем этапе, однако, производительность была такой же, как и на iOS7.1)

Теперь я изучаю трассировку анализатора OpenGL ES в инструментах для определения вызовов OpenGL, генерируемых «GLKBaseEffect prepareToDraw», посмотрите, кажется ли что-то необычным, и обновите сообщение соответственно, как только мне удастся что-то выяснить.

Я был бы очень признателен за любые рекомендации о том, как продвигаться на этом этапе - почему можно вызвать GLKBaseEffect prepareToDraw взять больше времени на iOS8.1?

+0

Если вы обнаружили значительную регрессию, вы должны зарегистрировать его с помощью Apple (https://bugreport.apple.com) на всякий случай, если это ошибка. Если вы можете предоставить пример кода, это поможет им. Кроме того, вы можете использовать Инцидент технической поддержки (TSI) и посмотреть, может ли инженер Apple помочь вам напрямую. Кроме того, сообщение SO о медленном OpenGL: http://stackoverflow.com/q/22562091/558933 –

+0

@RoboticCat Спасибо, я попытаюсь выполнить некоторые сравнительные тесты на устройстве iOS7.1, если смогу, а затем отправлю отчет. Трассировка анализатора OpenGL не показала ничего необычного - команды GL, созданные командой prepareToDraw, казались разумными, но завтра я снова рассмотрю это довольно поздно. Я тоже не знал о TSI, спасибо. – Amral

+0

Я могу подтвердить, что GLKBaseEffect prepareToDraw генерирует много ненужных вызовов glGetIntegerv (GL_CURRENT_PROGRAM, ...) и glGetUniformLocation(). Единые местоположения не изменяются, если, например, программа не связана повторно, и я ожидал, что GLKBaseEffect будет кэшировать эти местоположения в памяти, доступной в CPU. Однако я не знаю, генерировались ли одни и те же вызовы в iOS7, поэтому это может и не быть проблемой. – Amral

ответ

0

Причина проблемы была идентифицирована Джим Хиллхаусом и подтверждена Frogblast на форуме Apple Dev Forums "OpenGL Performance Drops > 50% in iOS 8 GM": установка текстового свойства UITextField (или UILabel, в моем случае) в представлении, которое является подзором GLKView приводит к тому, что GLKView viewview соответствует макету, что приводит к освобождению фреймбуферов и их перераспределению. Этого не происходило в iOS 7.

Обходной путь Джима Хиллхауса состоял в том, чтобы разместить subview внутри UIViewController и внедрить его в GLKView. Я сделал то же самое, используя Container View, чтобы удерживать контроллер вида, и могу подтвердить, что он работает.