Я оптимизирую игру, которая работает как для 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. Я рисую много спрайтов на сцене, почему так много времени занимает? Может быть, потому, что он так сильно масштабируется?
Когда вы удаляете "* ucolor" из вышеупомянутого кода, происходит много вещей:
Это гораздо меньше работы по сравнению с наличием "* ucolor" на месте.
Кроме того, это меньше операций на фрагмент в шейдере фрагмента.
Ваша проблема заключается в вашем шейдере фрагмента по умолчанию-2d-tex.shader. У вас есть унифицированный vec4 ucolor; Это означает, что каждый из ваших цветовых компонентов (RGBA) будет преобразован в 32-битное значение float. И это сильно снижает производительность. Должно быть: равномерный lowp vec4 ucolor;