2013-02-21 3 views
8

Я очень новый для OpenGL.Android Openg GL ES 2 рисунок больших текстур медленный

Я пытаюсь нарисовать текстурированные квадрациклы (2 треугольника). Размер текстуры - 900x900 пикселей. У меня нет проблем с одним квадом, но когда я пытаюсь привлечь 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; 
    } 

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

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

+0

немного более важная информация: растровые изображения находятся в формате ARGB_8888 и включен GL_BLEND. –

ответ

4

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

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

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

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

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

+0

Если текстура статического сжатия также может уменьшить пропускную способность памяти. Сжатие ETC1 возможно на всех мобильных устройствах. Он поддерживает только формат RGB без альфа-канала. – marekb

+0

Благодарим вас за ответы. Я пытался масштабировать текстуры до 1024x1024, но это не имеет никакого значения. И я не могу использовать ETC1, потому что получаю растровые изображения во время выполнения. Я попытался профилировать вызовы gpu, и похоже, что все вызовы занимают менее 2 мс ... –

+0

еще один тест: 10 квадрациклов, каждый с двумя текстурами 1024x1024 (используется mix()): вызов eglSwapBuffers принимает abiut 35-40ms, но в Профайлер GPU для всего процесса рисования занимает менее 3 мс. –

1

Ваш S3, вероятно, имеет около 600 М текселей/сек заполнения (см. GLBenchmark). Если вы показываете полноэкранные квадратики - десять кварков с двойной текстурой дают 20M текселей за кадр. Предполагая, что GLBenchmark делает то, что он говорит (измеряет пропускную способность текстурирования) 20M тексели составляет 1/30 от уровня заполнения, давая 33 мс наилучшим образом hw может обрабатывать один кадр. Смешивание Framebuffer Я уверен, что активно конкурирует за fillrate - смешение 10M пикселей довольно много, поэтому я могу догадаться, что узкое место может быть и там.

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

0

По моему опыту, проблемы с производительностью текстур обычно связаны с настройкой фильтрации 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 по сжатию текстур также обеспечивает большую производительность.