Android Openg GL ES 2 медленно отрисовывает большие текстуры

Я очень новичок в OpenGL.

Я пытаюсь нарисовать текстурированные квадраты (2 треугольника). Размер текстуры 900x900px. У меня нет проблем с одним квадом, но когда я пытаюсь нарисовать 5-10 квадов, я вижу заметное замедление.

Может я что-то не так делаю...

Код:

public void onDrawFrame(GL10 gl) {
    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);
    ... matrix calculation ...
    GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mvpMatrix, 0);
    GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);
}

Вершинные шейдеры:

uniform mat4 uMVPMatrix;
attribute vec4 vPosition;
attribute vec2 a_TexCoordinate;
varying vec2 v_TexCoordinate;
void main() {
  gl_Position = uMVPMatrix*vPosition;
  v_TexCoordinate = a_TexCoordinate;
}

Фрагментный шейдер:

    precision mediump float;
    uniform sampler2D u_PreviewTexture;
    varying vec2 v_TexCoordinate;

    void main() {
      vec4 color = texture2D(u_PreviewTexture, v_TexCoordinate);
      gl_FragColor = color;
    }

Платформа для тестирования — Galaxy S3. В профилировщике я вижу, что около 60 мс занимает вызов eglSwapBuffers.

Как быстро нарисовать квадроциклы с большими текстурами?


person mik_os    schedule 21.02.2013    source источник
comment
немного более важная информация: растровые изображения в формате ARGB_8888 и GL_BLEND включен.   -  person mik_os    schedule 25.02.2013


Ответы (3)


Это может быть связано с размером ваших текстур и реализацией драйвера OpenGL устройств, которые вы используете.

Большинство современных графических процессоров неплохо справляются с текстурами NPOT (без степени двойки), но это приводит к изменению масштаба текстуры каждый раз, когда ее нужно нарисовать до ближайшей степени двойки (в вашем случае 1024X1024).

Попробуйте использовать следующие 2 решения:

1- Преобразуйте свои текстуры в 1024x1024 и используйте координаты в вашей геометрии, чтобы рисовать только то, что вам нужно (900x900)

2- Попробуйте сгенерировать MIP-карты, если у вас много масштабирования, это спасет производительность во многих сценариях.

person Maurizio Benedetti    schedule 22.02.2013
comment
Если текстура является статическим сжатием, это также может уменьшить пропускную способность памяти. Сжатие ETC1 возможно на всех мобильных устройствах. Он поддерживает только формат RGB, без альфа-канала. - person marekb; 24.02.2013
comment
Спасибо за ответы. Пробовал масштабировать текстуры до 1024х1024, но это не дает никакой разницы. И я не могу использовать ETC1, потому что получаю растровые изображения во время выполнения. Я попытался профилировать вызовы графического процессора, и похоже, что все вызовы занимают менее 2 мс... - person mik_os; 25.02.2013
comment
другой тест: 10 квадроциклов, каждый с двумя текстурами 1024x1024 (используется mix()): вызов eglSwapBuffers занимает около 35-40 мс, но в профилировщике GPU весь процесс рисования занимает менее 3 мс. - person mik_os; 25.02.2013

Ваш S3, вероятно, имеет скорость заполнения около 600 млн текселей в секунду (см. " rel="nofollow">GLBenchmark). Если вы рендерите полноэкранные квадроциклы, десять квадроциклов с двойной текстурой дают 20 М текселей на кадр. Предполагая, что GLBenchmark делает то, что говорит (измеряет пропускную способность текстурирования), 20 млн текселей составляют 1/30 от скорости заполнения, что дает 33 мс наилучшее оборудование, которое может обработать один кадр. Смешивание кадрового буфера, я уверен, активно конкурирует за скорость заполнения - 10M смешанных пикселей - это довольно много, поэтому я могу предположить, что узкое место также может быть здесь.

Что можно попробовать, чтобы убедиться, что это медленная часть - уменьшите размер текстуры, скажем, до 512x512, и посмотрите, как это повлияет на производительность. Уменьшите размер экрана визуализируемых четырехугольников (значительно, как и с текстурами — например, сделайте его на половину/четверть экрана).

person kerim    schedule 25.02.2013

По моему опыту, проблемы с производительностью текстур обычно возникают из-за того, как настроена фильтрация MIPMAP. Значительная часть производительности может быть потеряна, если следующие параметры не установлены оптимальным образом (показаны минимальные настройки):

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.0f); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

Если возможно, попробуйте отключить тестирование глубины. Совет @marekb по сжатию текстур также дает много преимуществ в производительности.

person kineticfocus    schedule 02.03.2013