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

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

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

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

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

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

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

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

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

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

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

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

Intereting Posts
Android: образец микрофона без записи, чтобы получить живую амплитуду / уровень? Получить linearLayout из другого xml Android Как перенести приложение на передний план при нажатии на значок уведомления (из Сервиса)? Google gson Класс LinkedTreeMap, переданный в myclass Как проверить FileLock без обрезания файла? SMS_RECEIVED не работает над сэндвичем с мороженым? Получить высоту и положение строки состояния для api 11, чтобы изменить цвет Отображение изображений на Android Уведомление о восстановлении задачи, а не конкретной деятельности? Как получить текущее местоположение в Google Maps API V2 Возвращаемое значение класса AsyncTask onPostExecute Универсальный загрузчик изображений Android, показывающий изображения частично Цвет TabHost изменен между версиями Android SetOnClickListener (View.OnClickListener) в типе View не применим для аргументов (SequencerActivity) back.setOnClickListener (this); Android щепотку увеличить большое изображение, эффективность памяти без потери деталей