Как исправить задержку при первом использовании шейдера? - PullRequest
5 голосов
/ 07 сентября 2011

Я запустил инструмент анализа OpenGL ES из Instruments в моем приложении, и он заявил, что после компиляции шейдера я должен вызвать glDrawArrays в прогрев перед прогоном.Итак, я проверил время некоторых шейдеров, которые я написал, и действительно, когда программа запускается в первый раз, она намного медленнее.

В моем коде у меня есть общий загрузчик шейдеров, который не знает форм / атрибутов шейдеровСкомпилируй.И кажется, что лучшее место для предварительного подогрева шейдера - там (поэтому мне не нужно добавлять glDrawArrays везде).Я попытался добавить это в свой загрузчик шейдеров:

glUseProgram(prog);
glDrawArrays(GL_TRIANGLES, 0, 0);

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

1 Ответ

2 голосов
/ 23 января 2012

Ваш код (почти) совершенно безопасен.Униформа не является проблемой, так как они содержат некоторые значения по умолчанию.Что касается атрибутов, это тоже не проблема, так как вы не излучаете никаких вершин.

С другой стороны, это может быть самый простой способ подогреть шейдеры, но не самый лучший.Подобные методы использовались в то время, чтобы разогреть текстуры (чтобы заполнить кеш текстуры).Обычно это делается путем рендеринга нескольких кадров без отображения вывода.Это было видно, например, в Unreal Tournament, он отображал «Precaching» на короткое время после загрузки уровня.Я бы предложил сделать то же самое.

...