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

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

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

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

01.11.2012, 13:01. Просмотров 795. Ответов 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 Studio? - Программирование Android
В андроид студио сборкой занимается gradle. Что именно он делает, я не знаю, но явно что-то лишнее. Сборка простого java класса, выводящего...

Привязка текстур и SpriteBatch - Программирование Android
Читал в хелпе по LibGDX, что дергается видеокарта всякий раз, когда привязывается текстура. И что типа если использовать TextureRegion, то...

Ускорить эмулятор андроид студии - Программирование Android
Всем доброго времени суток! Нужен совет по железу. Собираюсь его обновлять что бы эмуляторы устройств (android, windows phone) на visual...

Есть ли способ ускорить данный Canvas? - Программирование Android
50 слайдов по 80Кб меняются на протяжении 8 секунд, изначальная анимация работает 6 секунд. Подскажите, пожалуйста, что я не так...

Как можно нарисовать многоугольник - Программирование Android
Доброе время суток. Как можно нарисовать многоугольник на canvas, если есть размеры сторон углы в градусах и размеры диагоналей. Какие...

Как можно воспроизвести видео - Программирование Android
Я хочу что бы мне воспроизводилось видео, а если на него нажмет пользователь то был бы сделан переход на другую активность, искал в Google,...

Как воспроизвести потоковое видео, можно ли? - Basic4Android
Подскажите пожалуйста, как воспроизвести потоковое видео, какую библиотеку использовать

Как можно исполльзовать атрибут minWidth? - Программирование Android
Пытаюсь понять разницу между width и minWidth. И не понимаю. Объясните пожалуйста. Определение minWidth: Заставляет TextView быть,...

Как можно уменьшить границы Checkbox - Программирование Android
Как можно уменьшить толщину линии(границы CheckBox)? Как ее размерами можно управлять? Ну boarder checkbox.

Клавиатура. Как можно упростить использование? - Программирование Android
Появилось несколько вопросов по клавиатуре. 1) Можно ли сделать программное нажатие кнопки на клавиатуре? А именно микрофон...

Как можно сделать маштабируемость экрана - Программирование Android
Есть ли возможность уменьшать, увеличивать представление приложения так же как мы делаем это в браузере

Как можно реализовать слушатель новых сообщений? - Программирование Android
Здравствуйте! Я хочу понять, как можно реализовать получение новых сообщений, даже когда приложение свернуто\закрыто? Как в любом...


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

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

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