Возвращение CompileIntermediate занимает от 0,2 до 3 секунд или более (тот же шейдер / случай). Зачем? (IMGSGX543GLDriver на iOS 7)
Кажется, я столкнулся с известной проблемой iOS, когда вызов glDrawElements вызывает задержку компиляции шейдера. Я использовал инструменты, чтобы найти подфункцию, вызывающую большинство накладных расходов в этом случае.
Хотя я не очень рад, что во время рисования происходит компиляция, меня по-настоящему сбивает с толку то, что я вижу время компиляции шейдеров от 0,2 до 5,0 секунд или более. Работая на инструментах с инструментами выделения памяти, я фактически получил задержку 40,0 секунд (!)
Типичный стек выглядит так:
18 OpenGLES 2939.0 glDrawElements
17 GLEngine 2939.0 glDrawElements_ACC_ES2Exec
16 GLEngine 2939.0 gleDoDrawDispatchCoreES2
15 IMGSGX543GLDriver 2939.0 gldUpdateDispatch
14 IMGSGX543GLDriver 2938.0 gpusLoadCurrentPipelinePrograms
13 IMGSGX543GLDriver 2915.0 glrUpdateCtxSysFragmentProgram
12 IMGSGX543GLDriver 2761.0 sgxUpdateCtxSysProgram
11 IMGSGX543GLDriver 2760.0 ppimgCompileShader
10 IMGSGX543GLDriver 2759.0 PVRUniFlexCompileToHw
9 IMGSGX543GLDriver 2658.0 CompileIntermediate
Где "2930.0" и т. Д. - время, потраченное на эту функцию в миллисекундах.
"Виновником" является громоздкий фрагментный шейдер (350 строк). Хорошо, это большой, но он компилируется без каких-либо ошибок или предупреждений. Извините, я не могу опубликовать код шейдера или ссылку на него, но я думаю, что другие могут столкнуться с подобными ошибками (я полагаю, что размер шейдера увеличивает проблему, если что-нибудь).
Кто-нибудь сталкивался с этим раньше? Вы можете помочь?
Проблема наблюдается в iOS7 под управлением iPad2 и iPod touch. От одной сборки к другой проблема может возникнуть на одном из устройств, или на обоих, или ни на одном. Я не мог однозначно определить, изменится ли запуск приложения снова и снова, пока кажется, что он отображается для каждой сборки.
Немного больше информации: - никогда не происходило второй (или какой-либо со временем), шейдер загружается приложением. - шейдер загружается очень скоро после запуска приложения, но это не первый шейдер, загруженный этим приложением. - откладывание загрузки этого шейдера на некоторое время (например, от 0,5 до 1,0 секунды) не помогает
1 ответ
На самом деле это известная проблема, и в документации Apple говорится:
Создание шейдерной программы является дорогостоящей операцией по сравнению с другими изменениями состояния OpenGL ES. Компилируйте, связывайте и проверяйте свои программы при инициализации приложения. Как только вы создали все свои шейдеры, приложение может эффективно переключаться между ними, вызывая glUseProgram.
К сожалению, я не думаю, что вы можете скомпилировать свой шейдер быстрее, но, по крайней мере, скомпилируйте его раньше, когда вы инициализируете свое приложение.