Шейдер OpenGL ES снижает производительность

1

Я оптимизирую игру, которая работает как для iPhone, так и для Android. Я использую 4 шейдера для рисования сцены, и я заметил, что если я перехожу один из них в другой, fps идет от 32 до 42, хотя на этом шейдере всего 1 спрайт, и единственное различие в этих двух шейдерах является всего лишь продуктом в фрагментаторном шейдере.

Это шейдеры:

по умолчанию-2d-tex.shader

#ifdef GL_ES
precision highp float;
precision lowp int;
#endif

#ifdef VERTEX

uniform mat4        umvp;

attribute vec4      avertex;
attribute vec2      auv;

varying vec2        vuv;

void main()
{
    // Pass the texture coordinate attribute to a varying.
    vuv = auv;

    // Here we set the final position to this vertex.
    gl_Position = umvp * avertex;
}

#endif

#ifdef FRAGMENT

uniform sampler2D   map0;
uniform vec4 ucolor;

varying vec2        vuv;

void main()
{
    gl_FragColor =  texture2D(map0, vuv) * ucolor;
}

#endif

по умолчанию-2d-текс-white.shader

#ifdef GL_ES
precision highp float;
precision lowp int;
#endif

#ifdef VERTEX

uniform mat4        umvp;

attribute vec4      avertex;
attribute vec2      auv;

varying vec2        vuv;

void main()
{
    // Pass the texture coordinate attribute to a varying.
    vuv = auv;

    // Here we set the final position to this vertex.
    gl_Position = umvp * avertex;
}

#endif

#ifdef FRAGMENT

uniform sampler2D   map0;

varying vec2        vuv;

void main()
{
    gl_FragColor =  texture2D(map0, vuv);
}

#endif

Еще раз,
Если я изменяю default-2d-tex.shader и удаляю продукт "* ucolor", fps идет от 32 до 42, и я использую его только для одного спрайта на сцене!

Это нормально? Почему этот шейдер настолько медленный и как я могу его улучшить?

РЕДАКТИРОВАТЬ:

Я вижу это замедление производительности как на iPod, так и на Android в равном соотношении. Оба являются графическими процессорами PowerVr SGX (iPod 3rd gen и Samsung Galaxy SL -PowerVR SGX 530-). Версия iOS - 4.1, Android - 2.3.3

Спрайт, который я рисую, масштабируется для заполнения экрана (масштабируется до 4x), и я рисую его один раз за кадр. Он берется из текстурной карты, поэтому текстура на самом деле больше (1024x1024), но взятая часть составляет 80x120. Альфа-смешивание включено.

EDIT 2

Я допустил ошибку. Спрайт масштабируется 11x: его 32x48. Если я вообще не рисую этот спрайт, fps идет до 45. Я рисую много спрайтов на сцене, почему так много времени занимает? Может быть, потому, что он так сильно масштабируется?

  • 2
    Рекомендуется измерять время рендеринга фрейма, а не частоту фреймов при профилировании. Частота кадров не всегда лучший показатель . На каком оборудовании и версии ОС вы видели это замедление? Является ли замедление согласованным на Android и iOS? Насколько велик в пикселях этот спрайт? Какой режим смешивания вы включили?
  • 0
    Мне было трудно найти, что разница в коде заключается только в конечном умножении выходных данных в фрагментном шейдере. Вы должны были просто опубликовать эту часть. И я сомневаюсь, что такое небольшое умножение вызывает падение производительности. Как проходит настройка вашего рендера? Если ваша настройка рендеринга имитирует больше пикселей, что часто используется для постобработки, это может привести к снижению производительности.
Показать ещё 3 комментария
Теги:
performance
iphone
opengl-es
glsl

2 ответа

4
Лучший ответ

Когда вы удаляете "* ucolor" из вышеупомянутого кода, происходит много вещей:

  1. единый ucolor становится неиспользованным
  2. Компилятор GLSL удаляет эту униформу из набора активной униформы
  3. когда у вас установлена программа, идентификатор отсутствующей униформы становится -1
  4. когда вы делаете glUniform4fv (-1, значение) для удаленной униформы, он просто выходит мгновенно, без какого-либо обновления

Это гораздо меньше работы по сравнению с наличием "* ucolor" на месте.

Кроме того, это меньше операций на фрагмент в шейдере фрагмента.

  • 2
    Тогда использование униформ вообще было бы самым большим убийством производительности, связанным с его падением частоты кадров! Я никогда не наблюдал такого выпадающего с использованием униформы.
  • 0
    Это. Этот шейдер имеет только 1 форму, которая постоянно обновляется. Униформа была снята. Это объясняет некоторое повышение производительности. Также сам шейдер становится более легким. Это объясняет увеличение скорости.
Показать ещё 6 комментариев
2

Ваша проблема заключается в вашем шейдере фрагмента по умолчанию-2d-tex.shader. У вас есть унифицированный vec4 ucolor; Это означает, что каждый из ваших цветовых компонентов (RGBA) будет преобразован в 32-битное значение float. И это сильно снижает производительность. Должно быть: равномерный lowp vec4 ucolor;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню