Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
ioioioi
96 / 28 / 6
Регистрация: 25.06.2010
Сообщений: 104
#1

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

01.11.2012, 13:01. Просмотров 880. Ответов 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.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.11.2012, 13:01
Ответы с готовыми решениями:

Как ускорить сборку в Android Studio?
В андроид студио сборкой занимается gradle. Что именно он делает, я не знаю, но...

Рендер текстур ландшафта с применением тесселляции и дерева
Здравствуйте! Только недавно стал изучать тесселляцию в шейдерах. Наткнулся на...

OpenGL: Как создать рендер девайс, рендер контекст встроенными средствами?
Я что-то не понял.Как создать рендер девайс,рендер контекст ВСТРОЕННЫМИ...

Как можно ускорить запрос?
Есть две таблицы table1 и table2. Среди прочих полей каждая имеет 5 полей,...

Ускорить деление больших чисел
Всё бы ничего, да уж очень медленно. :( По форуму смотрел, в Инете искал....

1
ioioioi
96 / 28 / 6
Регистрация: 25.06.2010
Сообщений: 104
06.11.2012, 07:38  [ТС] #2
Написал код на плюсах - разделяю каналы, создаю текстуру с тремя каналами и две текстуры с одним каналом
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.11.2012, 07:38

как можно ускорить процесс рисования ??
#include<windows.h> #include<string.h> #define ID_TIMER 777u...

Как можно ускорить выполнение программы?
Помогите как можно ускорить выполнение программы var x,y:array of integer;...

Как можно ускорить выполнение программы?
Здравствуйте. Написал программу для моделирования систем массового...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru