2015-06-23 3 views
1

В целом есть ли штраф за производительность, просто включив расширения OpenGL ES в шейдере?Существует ли ограничение производительности для включения расширений OpenGL ES?

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

Меня интересует iOS.

ответ

1

Что касается исполнения шейдеров, просто требуется расширение, это не имеет никакого эффекта. Шейдер скомпилирован в совместимый с GPU формат, а #extension (являющийся маркером перед процессором) не повлияет на сгенерированный вывод. Вы можете проверить эквивалентность сгенерированного вывода на других платформах GLES (например, Android), где доступно glGetProgramBinaryOES, и сравнение сгенерированного шейдера с без препроцессора #extension.

У анализатора GLSL будет дополнительная работа по разбору шейдера. Маловероятно, что это будет значительное количество дополнительного времени обработки для одного шейдера, но это зависит от компилятора шейдера драйвера. Если у вас очень большое количество шейдеров, эта совокупная дополнительная работа может стать значительной. В этом случае может быть полезно удалить #extension, если они не нужны вашим шейдером.

В частности, для iOS компиляция шейдеров хэшируется, так что двоичные файлы автоматически сохраняются для последующих компиляций шейдеров, даже в сеансах приложений. Это означает, что вы платите только стоимость анализатора при первом запуске приложения (если только ваши шейдеры не являются динамическими), что снижает эффективность анализатора. Это не так на Android, где программные двоичные файлы должны быть сохранены и загружены явно с glGetProgramBinaryOES и glProgramBinaryOES, чтобы получить такое же поведение.

Сказанное, требующее расширения, подразумевает, что вы будете использовать его, что может сильно повлиять на шейдер в зависимости от того, какое расширение оно и что вы делаете с ним. list of iOS GLES extensions включает в себя несколько, которые разрешены оператором #extension (EXT_draw_instanced, EXT_shader_texture_lod, EXT_shader_framebuffer_fetch, ...). Легко представить себе, что шейдер, который отображает фреймбуфер с расширением EXT_shader_framebuffer_fetch, займет больше времени, чем эквивалентный шейдер, который этого не делает.

+0

Спасибо за подробный ответ. В последнем абзаце вы заявляете, что получите это потенциальное влияние на производительность, только если используете расширение? – combinatorial

+0

, если вы используете функциональность из расширения, очевидно, что это может (резко) повлиять на производительность. Не использовать расширение, которое вы объявляете в препроцессоре, не будет экономить вас от дополнительного времени синтаксического анализа (как описано в параграфе 2). – MuertoExcobito

 Смежные вопросы

  • Нет связанных вопросов^_^