Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
ioioioi
96 / 28 / 6
Регистрация: 25.06.2010
Сообщений: 104
#1

Как можно ускорить рендер больших текстур? - Android

01.11.2012, 13:01. Просмотров 782. Ответов 1
Метки нет (Все метки)

Задался вопросом:
Имеются две текстуры 1024х1024. Они подаются на вход фрагментному шейдеру, шейдер с ними что то делает (в моем случае эффект bump mapping) и выдает одну текстуру. При этом выясняется что основное время тратится на транзакции в оперативную память: 1024*1024*4 байта * 2 текстуры ~8.4 метра гоняются туда-сюда каждый кадр.
На сколько я знаю устройство видеочипа в мобильных девайсах, происходит следующее:
т. к. своей видеопамяти нет, видеочип импользует оперативную память, что довольно медленно. Каждый кадр мультипроцессор гпу берет небольшой кусочек текстуры в текстурный буфер, далее делает над ним какие то операции, затем берет следующий кусочек и т.д. По опыту знаю, что доступ в оперативную память на несколько порядков медленнее, чем сами вычисления на гпу.
Поправьте меня, если ошибаюсь.
Это позволяет мне сделать вывод, что быстродействие упирается в большое количество данных. То есть основное время гпу отдыхает. Напрашивается решение: уменьшить глубину цвета текстуры. Например отбросить альфа канал - он мне все равно не нужен. Так же можно попробовать сжать текстуру.

А теперь собственно вопрос:
Как в андроиде уменьшить битность текстуры? В частности отбросить альфа канал. Вообще мне нужно оставить только два канала - красный и зеленый. То есть мне нужно какое то универсальное решение, когда я могу сам указать какие каналы цвета мне нужны, при этом сохраняя все пряники в виде билинейной фильтрации.

На данный момент я загружаю текстуры так:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
GLES20.glGenTextures(2, texId, 0);
        GLES20.glPixelStorei(GLES20.GL_UNPACK_ALIGNMENT, 1);
        GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texId[COLOR]);
        GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
        GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
        Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.color);
        GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0);
        bitmap.recycle();
        GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texId[NORMAL]);
        GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
        GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
        bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.normal);
        GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0);
        bitmap.recycle();
Использую в шейдере:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
precision mediump float;
                uniform sampler2D colorMap;
                uniform sampler2D normalMap;
                varying vec4 texCoord;
                uniform vec3 light;
                void main() {
                    vec3 normal = texture2D(normalMap, texCoord.st).rgb;
                    normal = 2.0*normal-1.0;
                    vec3 n = normalize(normal);
                    vec3 l = normalize(light);
                    float a = dot(n, l);
                    gl_FragColor = a*texture2D(colorMap, texCoord.st);
                }
PS В том, что производительность упирается в работу с памятью, а не в вычисления - уверен полностью. Пробовал добавлять лишние вычисления, убирать их - fps не меняется. То есть вычисления занимают ничтожно малое время.
PPS Не спрашивайте, зачем мне текстуры больше размера экрана это просто тест, так легче замерять fps.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.11.2012, 13:01     Как можно ускорить рендер больших текстур?
Посмотрите здесь:

Как можно воспроизвести видео Android
Android Есть ли способ ускорить данный Canvas?
Как можно указать размер ImageView из кода в DP Android
Как воспроизвести потоковое видео, можно ли? Basic4Android
Android Как ускорить сборку в Android Studio?
Android Как можно сделать маштабируемость экрана
Android Привязка текстур и SpriteBatch
Android Как можно сделать scrolling не текста, а картинок?
Клавиатура. Как можно упростить использование? Android
Android Как можно изменить цвет переключателя SwitchCompat?
Android Как можно нарисовать многоугольник
Как можно уменьшить границы Checkbox Android

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ioioioi
96 / 28 / 6
Регистрация: 25.06.2010
Сообщений: 104
06.11.2012, 07:38  [ТС]     Как можно ускорить рендер больших текстур? #2
Написал код на плюсах - разделяю каналы, создаю текстуру с тремя каналами и две текстуры с одним каналом
Yandex
Объявления
06.11.2012, 07:38     Как можно ускорить рендер больших текстур?
Ответ Создать тему
Опции темы

Текущее время: 13:07. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru