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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
Программирование Android Как сделать так, чтобы ссылка (к примеру http://google.com) открывалась в стандартном браузере? http://www.cyberforum.ru/android-dev/thread685739.html
Как сделать так, чтобы ссылка (к примеру http://google.com) открывалась в стандартном браузере. Но нужен обязательно html-код, который, к примеру, можно было бы вставить на сайт (по поринципу:...
Программирование Android Не работает запрос из нескольких таблиц Доброго времени суток. Такая проблема: есть БД из 3 таблиц, если делаю запрос из одной таблицы, все отлично работает, стоит сделать запрос из 2 или 3 таблиц - приложение сообщает об ошибке. Листинг... http://www.cyberforum.ru/android-dev/thread685657.html
Не получается отрендрить треугольник OpenGL 2.0 Программирование Android
Здравствуйте! Пытаюсь написать свой 2D-движок (просто спортивный интерес, не нужно мне говорить, что это почти нереально и советовать AndEngine, я просто хочу разобраться как это все работает и...
Программирование Android Недействительные показы AdMob
Всем привет. Я встроил баннер AdMob в приложение и меня не устраивало, что объявления не меняются с момента создания AdView и отправки запроса. Я сделал, чтобы каждую минуту запрос отправлялся...
Программирование Android Проверка числа http://www.cyberforum.ru/android-dev/thread685389.html
Здравствуйте Прошу помочь мне Не совсем понял как это сделать и есть ли встроенная функция типа isNan Проблема состоит в следующем: у меня из текстового поля программы считывается по идеи число но...
Программирование Android Диалоги, нужно уничтожать ? Намудрил с диалогами нужна помощь: @Override protected Dialog onCreateDialog(int id) { switch (id) { case 0: AlertDialog.Builder builder_0 = new AlertDialog.Builder(this);... подробнее

Показать сообщение отдельно
ioioioi
96 / 28 / 6
Регистрация: 25.06.2010
Сообщений: 104

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

01.11.2012, 13:01. Просмотров 823. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru