Файлы shaders в телефоне что это
Приветствую всех. Сегодня мы должны выяснить предназначение одной директории, которую можно встретить в операционной системе Андроид. И помните — просто так даже не думайте удалять никакие папки или проги с телефона!
Ребята, сразу вас огорчу — реально нет никакой точной инфы о предназначении папки! То, что я здесь написал — это максимум что вы сможете найти в интернете, если только не посвятите поискам инфы целый день))
Мой совет
Не знаю поможет ли мой совет, но я бы сделал так при возможности — переименуйте папку, например была Shaders, а вы задайте имя Shaders_ — то есть добавьте символ нижнего проблема.
Потом выполните перезагрузку телефона и проверьте — работает ли все нормально? все установленные приложения, запускаются ли все игры? Если при этом папка появилась заново и все в смартфоне работает нормально — значит папка выполняет роль некого кэша. То есть удалять можно. Но лучше поэкспериментировать и проверить точно. Ну а если будут ошибки — восстанавливаете название переименованной папки обратно.
Такая папка может быть даже в операционке Microsoft Windows от игры Prepar3D v4 (некий шутер или симулятор самолетов):
Итак, какие папки мне можно (или нужно) удалять?
Не уверен – не удаляй. Это справедливо для всех папок приложений, и трогать их не стоит, за исключением тех случаев, когда вы точно знаете, что хотите сделать. Добавлять и удалять файлы из любых папок с медиа абсолютно безопасно, но постарайтесь в порыве наведения порядка не снести саму папку. Если вы видите, что папка пуста, например, ничего нет в папке Alarms, вы, можете подумать, что она и сама не нужна. Но, с другой стороны, папка не занимает много места. И возможно, она потребуется какому-либо приложению впоследствии, поэтому так ли вам необходимо ее удалять?
Со временем встроенная память вашего устройства будет содержать гораздо больше папок, чем было перечислено выше. Вы будете устанавливать и удалять все большее число приложений. Поэтому наводить порядок в своем устройстве никогда не повредит, ну, разве что вы вообще редко перемещаете файлы в своем телефоне, скачиваете и удаляете их. И еще, удаление пустой папки не освободит вам дополнительного места в памяти. Так что, если требуется выиграть место, лучше посмотрите, какие вы можете удалить ненужные приложения/фильмы, которые не станете пересматривать и т.п.
Теперь, когда вы получили более полную картину того, что это за папки хранятся в памяти вашего устройства, вам будет проще управлять своими файлами, не боясь «сделать что-нибудь не то».
Заключение
К сожалению нормальной инфы узнать не удалось.
- Понятно одно — папка Shaders содержит шейдеры игры или их кэш. Удалять можно только в том случае, если вы уверены что папка содержит только кэш. В остальных случаях после удаления могут быть траблы с игрой.
Повторюсь, если папка ничем не мешает — лучше оставить, мало ли.
Пользователи часто сталкиваются с тем, что на устройствах, работающих под управлением операционной системы Android, по умолчанию содержится множество папок с совершенно непонятным названием, назначением и содержанием. И пока памяти на гаджете достаточно, их наличие, в общем-то, никого особо не волнует. Но как только устройство начинает сигнализировать о заполненном хранилище, возникает желание удалить все ненужное, хотя прежде не помешает разобраться, что именно относится к этой категории. И первой на пути возникает непонятная папка Shaders.
Иерархия памяти устройства на Android
Поскольку Android – это операционная система на базе Linux, в вашем телефоне файловая система также организована по принципу Linux. В этой системе на каждом устройстве есть шесть основных разделов: boot, system, recovery, data, cache и misc. Карты памяти microSD также имеют собственную иерархию памяти. Устройства, несущие на борту Android 7.0 Nougat, получили возможность непрерывного обновления за счет того, что в пару к системному разделу создается второй и один из них в фоне обновляется, а при перезагрузке происходит переключение, позволяющее обновленной системе заработать.
Вот краткое описание того, что содержится в каждой папке.
Без root–прав пользователи Android могут иметь доступ только к разделу с данными, который открывается вам, когда вы подключаете устройство к своему ПК или используете файловый браузер. Если память вашего телефона может быть расширена при помощи карты, память карты также включается в этот раздел с данными, доступными через ПК или просмотрщик файлов.
Обычно у вас есть доступ только данным приложений, которые хранятся в разделе пользовательских данных. Для доступа к остальной памяти вам потребуются root-права
Векторизация вычислений
Как было показано в предыдущей статье цикла, почти на трети мобильных устройств установлены видеокарты, использующие векторный конвейер инструкций. При этом эти видеокарты можно отнести к средним и слабым по производительности, а значит, приведение кода к «векторному виду» в целом целесообразно.
Векторизация производится путем упаковки разнородных скалярных величин в векторы и совмещения нескольких скалярных операций в одну операцию с вектором.
Можно переписать так:
В данном случае не стоит полностью полагаться на оптимизатор, поскольку качество последнего варьируется от производителя к производителю и от драйвера к драйверу. Ведь в OpenGL ES компиляция GLSL полностью делегирована драйверу видеокарты.
Приведем пример тривиального шейдера в скалярном и векторном исполнении и результаты его профилирования для видеокарт Mali архитектуры Midgard.
Результаты Mali Offline Compiler:
В векторном исполнении получилось на 2 арифметические и 3 загрузочные инструкции меньше, а также задействовано 2 регистра вместо 3-х. При этом сократилось количество требуемых тактов на выполнение шейдера.
Создание GLTextureView
Итак, в GLSurfaceView есть почти все, что нам нужно для рендеринга OpenGL. Нам всего лишь нужно скопировать пригодный код в наш класс и внести некоторые изменения.
Создайте новый класс GLTextureView.kt , который наследуется от TextureView и расширяет TextureView.SurfaceTextureListener и View.OnLayoutChangeListener . Добавьте конструкторы.
5. Обновите метод finalize() до стандарта Kotlin. (Если у вас есть лучшее решение, напишите в комментариях).
6. Замените SurfaceHolder на SurfaceTexture .
7. Замените все упоминания GLSurfaceView на GLTextureView .
8. Обновите импорты, исключая использование GLSurfaceView . Также проверьте оставшиеся импорты и удалите все, что связано с GLSurfaceView .
9. Устранение проблемы с допустимостью нулевых значений после автоматического преобразования кода Java в Kotlin. В моем случае мне пришлось обновить методы переопределения и некоторые параметры, допускающие значение NULL (например, egl: EGL10 должно быть egl: EGL10? ).
10. Переместите константы в объект-компаньон или на верхний уровень.
11. Удалите неподдерживаемые аннотации.
12. Добавьте методы интерфейса SurfaceTextureListener .
13. В createSurface() вы наткнетесь на неработающую строчку, замените view.holder на view.surfaceTexture .
14. Переопределите onLayoutChange .
В результате у вас получится что-то вроде этого.
На устройствах Андроид можно наблюдать много установленных по умолчанию папок, которые не несут в себе серьезной функциональной нагрузки для системы. Другое дело, что определить их не так уж просто. Поэтому если системные файлы никак не мешают, и не забивают внутреннюю память смартфона, то лучше их все-таки не трогать.
Аналогичное правило распространяется и на Shaders. К тому же, удаление этой папки никак не способствует очистке памяти гаджета, поскольку повторный запуск игры приведёт к очередному кэшированию файлов.
Для полноценной работы с динамическими элементами пользовательского интерфейса, которые используют тени, фильтры в реальном времени для фото или видео, или адаптивный пользовательский интерфейс и освещение, недостаточно использовать только Canvas. Было бы куда лучше, если бы у нас в распоряжении было что-то помощнее. Раньше мы могли использовать RenderScript, но поддерживается ли он сейчас?
В этой статье я расскажу как использовать стандартные GLSL шейдеры OpenGL в вашем пользовательском view, которое является наследником класса Android View (android.view.View). Я предлагаю вам использовать это решение, если вы работаете над чем-нибудь из нижеперечисленного:
Шейдеры или коррекция цвета в реальном времени для видеопотоков.
Динамические тени и освещение для кастомных элементов пользовательского интерфейса.
Продвинутая попиксельная анимация.
Какие-либо эффекты пользовательского интерфейса, наподобие размытия (blurring), искажения (distortion), пикселизации и т. д.
Если вы создаете новый нейроморфный адаптивный пользовательский интерфейс.
Это решение предоставит вам надежную среду и множество примеров шейдеров, которые вы можете легко использовать в своем приложении. И я покажу вам, как легко это сделать!
Нам нужно, чтобы в нашем стандартном лэйауте лежал класс, который ведет себя так же, как Android View (android.view.View), и мы cможем использовать фрагментный шейдер OpenGL для визуализации его содержимого.
Демо-приложение с несколькими ShaderViews. Динамический свет и видео фильтры.
Как это работает на абстрактном примере
Предположим, мы хотим заказать у одного известного художника новую картину, написанную волшебными красками, и повесить ее на стену. Что мы имеем в нашей ситуации:
Волшебные краски — GLSL шейдеры OpenGL.
Холст — четырехугольник, который заполнит все пространство нашего кастомного view.
Известный художник — класс, реализующий интерфейс Render. Этот художник, в свою очередь, использует волшебные краски, чтобы нарисовать картину на холсте.
Картина — кастомный view-класс, который задействует художника с его/ее холстом и волшебными красками.
Стена — Activity или Fragment android.
Папка Shaders — что за зверь?
Загадочная папка есть далеко не на всех Андроидах. Ее присутствие в смартфоне обычно видят любители мобильных игр и развлекательных приложений. Она предназначена для кэширования графики игры. За счёт этого утилита загружается быстрее, а графическое отображение не страдает от недостатка трафика или других нюансов.
Различные игры, изображения бонусов и все графические рисунки из геймплея так же хранятся в Shaders.
При этом после открытия папки можно будет видеть исключительно белые файлы, отобразить которые будет невозможно. В то же время именно они помогают играм быстро и качественно загружаться, становясь очень ценным подспорьем для геймеров.
Понять важность кэша можно оценив разницу в скорости загрузки игры в первый и во все последующие за ним разы. После установки приложение всегда загружается дольше, чем во время повторного открытия.
Можно ли удалять и как это правильно сделать
Разработчики настоятельно рекомендуют не удалять системные файлы. Однако для любого правила действуют свои исключения. Вот и Shaders не относится к важным данным, которые нельзя трогать.
Важно! Среди геймеров бытует мнение, что удаление любого файла может расцениваться, как вмешательство в систему, что приведёт к бану в игре или невозможности дальнейшего гейминга. Однако таким влиянием рассматриваемая папка явно не обладает.
Тем не менее удалять данные, содержащиеся в Shaders, без крайней необходимости не стоит.
К тому же, все удаленные файлы будут восстановлены после повторного запуска утилиты. То есть никакого положительного эффекта достигнуто не будет, поскольку память смартфона заполнится снова. Перед удалением важно убедиться, что файлы действительно относятся к кэшу, и не нужны для более серьёзных действий, влияющих на приложение.
Сделать это можно двумя способами:
- посредством отслеживание объема;
- сменой имени.
При первом способе достаточно просто посмотреть, сколько весит хранилище до активной игры и по завершении процесса. Если вес существенно увеличивается, значит файлы – это всего лишь кэш.
Проверка важности содержимого также выполняется путём смены названия. Если после переименования утилита продолжит запускаться стабильно и без сбоев, значит файлы не имеют никакой системной важности, и их удаление не станет критичным для системы.
Вершинный шейдер (Vertex Shader)
Для наших целей нам достаточно простого вершинного шейдера для рендеринга нашего четырехугольника (мы не потратим кучу времени на его код).
Грамотное использование ветвления
Совершенно другим явлением является динамическое ветвление, результат которого зависит от неконстантных вычислений в шейдере. Если такое ветвление сделано в целях оптимизации, важно помнить, что на старых архитектурах GPU для получения оптимизационного эффекта во фрагментном шейдере важна «локальная однородность» результатов этого ветвления. Т.е. поток управления должен передаваться в одну и ту же ветку у всех пикселей, расположенных в определенной области изображения. В противном случае для этой области могут быть выполнены обе ветки для всех пикселей, и результат будет хуже.
Файловые менеджеры на Android могут быть удобным инструментом для организации хранения данных в вашем смартфоне, но сама структура Android (или ее кажущееся отсутствие) c непривычки может показаться несколько запутанной. Данные приложений, картинки, музыка – и доступ к этому всему из одной корневой папки – это несколько иной подход к иерархической структуре, чем то, к чему привыкли пользователи ПК и Mac, и подход этот дает пользователям намного больше возможностей, чем iOS.
В Android вы не сможете получить доступ к глубоко спрятанным системным файлам через обычный файловый менеджер или с помощью подключения к ПК. Но это не значит, что вы можете удалить по своей прихоти любой файл, какой захотите. Давайте посмотрим, как организованы типичные папки в памяти устройства, для чего они нужны и что из этого вы можете удалить, а что нет.
Как это работает с технической точки зрения
Давайте выберем родительский view для нашего кастомного view-класса (кстати, мы назовем наш view-класс ShaderView ). Тут у нас есть два варианта: SurfaceView и TextureView . Я вернусь к разнице между ними через пару мгновений.
Создадим класс Render , который будет отображать view с использованием шейдеров.
Создадим 3D-модель четырехугольника (quadrangle), который заполнит все пространство view (3D, поскольку OpenGL был создан для 3D-сцен). Не беспокойтесь об этом; это стандартное решение, и с ним не связано никаких трудностей.
Перемещение вычислений выше по pipeline
Типичный сценарий рендера на GPU предполагает следующее соотношение сущностей:
Количество объектов, которому соответствует количество вызовов отрисовки и установки шейдерных констант, значительно меньше количества вершин, а количество вершин — значительно меньше количества пикселей.
Исходя из этого, можно сформулировать такие принципы:
- Если имеется вычисление в шейдере, которое зависит только от констант (uniform), т.е. его результат одинаков для всех вершин и пикселей, то его стоит производить в коде для CPU и устанавливать как готовую константу.
- Если имеется вычисление во фрагментном шейдере, которое является линейным преобразованием переданных из вершинного шейдера величин (varying), то его стоит производить в вершинном шейдере и передавать во фрагментный шейдер готовый результат в varying.
interp(c0 * Att0 + c1 * Att1 + … + cn) == c0 * interp(Att0) + c1 * interp(Att1) + … cn |
Эта особенность и позволяет переносить такие вычисления в вершинный шейдер. За счет того, что количество инвокаций вершинного шейдера меньше, чем фрагментного, получаем ускорение. Отметим, что преобразование вида Att0 * Att1 уже не является линейным.
Здесь функция mix является линейным преобразованием varying v_screenCoord, поэтому её можно вызвать в вершинном шейдере, передав во фрагментный шейдер подготовленные значения в v_screenCoord.xy. Во фрагментном шейдере остается сделать только преобразование, нелинейно зависящее от двух интерполируемых величин: v_screenCoord.x * v_screenCoord.y
Если при переносе вычислений в вершинный шейдер появляются новые varying, важно отслеживать баланс между экономией арифметических инструкций и появлением новых Load & Store операций, загружающих дополнительные интерполируемые величины. Load & Store операции в целом более накладные, чем арифметические инструкции.
Код шейдеров
В этой статье мы будем использовать самые простые шейдеры, чтобы сделать наш код менее сложным. Если вас интересуют более сложные шейдеры, вы можете найти их здесь или здесь.
Точность mediump
В OpenGL ES предусмотрена возможность задавать точность величин при помощи квалификаторов lowp, mediump и highp.
uniform lowp sampler2D u_texture0; varying mediump v_pos; … mediump float temporary; |
Применение пониженной точности позволяет задействовать меньше регистров и добиться повышенной плотности вычислений за такт. Как было рассказано в предыдущей статье, применение точности lowp сегодня нежелательно. Она поддерживается на аппаратном уровне только в устаревающих моделях PowerVR, а на всех современных GPU вместо lowp фактически используется mediump. Такая ситуация напрасно усложняет процессы QA, если в шейдерах используется lowp.
Есть ли смысл применять mediump? В самых актуальных рекомендациях по оптимизации для мобильных GPU по-прежнему предлагается по возможности использовать mediump во фрагментных шейдерах. Остановимся подробнее на этой точности.
Как мы показали выше, в GLSL ES точность можно задать отдельным переменным — uniform-ам и varying-ам. Кроме того, есть возможность задать точность по умолчанию для всех величин определенного типа. Например, используя такую строчку в начале шейдера, можно задать точность mediump для всех float:
С такой строкой в начале фрагментного шейдера можно получить заметное ускорение на большинстве мобильных видеокарт (при условии, что в шейдере большое количество арифметических инструкций).
Приведем пример выдачи утилиты Mali Offline Compiler для архитектуры Midgard для шейдера, содержащего большое количество арифметики.
С точностью highp (precision highp float;) получаем 32 такта на выполнение шейдера:
С точностью mediump — 21 такт:
Отметим, что, несмотря на немного возросшее количество инструкций, оценочное время выполнения шейдера сократилось. Это связано с тем, что за 1 такт с точностью mediump выполняется больше инструкций, чем с highp.
Похожую картину можно наблюдать в PVRShaderEditor от Imagination для видеокарт PowerVR Rogue.
С «precision highp float;» получаем:
Используются умножения с полной точностью, выполняемые по 2 за такт.
Если же начинать такой же шейдер строчкой «precision mediump float», можно увидеть, что операции были упакованы в 16-битные суммы произведений (SOP). Это операции вида a * b + c * d. Архитектура PowerVR Rogue позволяет выполнять 2 такие операции за такт, что дает большую плотность операций по сравнению с точностью highp:
Вместо 20 тактов с точностью highp, с mediump получили 15 тактов.
Смешанное использование точностей
Установка точности highp по умолчанию и выборочное понижение точности до mediump работает плохо. Лучший результат дает установка mediump по умолчанию и выборочное повышение точности там, где это необходимо. Приведем некоторые часто встречающиеся случаи, где требуется высокая точность:
- Текстурирование большими текстурами или текстурирование с повторением (GL_TEXTURE_WRAP_S/T = GL_REPEAT). Точности mediump текстурных координат хватает на 1024 пикселя. В случае использования GL_REPEAT это утверждение справедливо для текстурных координат, начинающихся с нуля.
- Параметр времени для анимации. Минимально возможные инкременты времени, передаваемого как mediump, быстро увеличиваются с ростом его значения. Типичный сценарий — через несколько минут после начала анимации, где у времени точность mediump, анимация становится «дерганой». Решить эту проблему можно зацикливанием передаваемого времени, если анимация основана на периодических функциях.
- Попиксельное освещение в 3D с использованием позиций источника света и освещаемой точки. По возможности все вычисления с большими величинами нужно делать на полной точности в вершинном шейдере, передавая во фрагментный только нормированные векторы с пониженной точностью.
Расширения
Чтобы облегчить себе работу, мы создадим расширения, которые загружают исходный код шейдера из каталога ресурсов.
Учет количества используемых регистров
В типичной архитектуре GPU имеется общий банк регистров (register file), используемый множеством параллельно выполняемых потоков. Каждый такой поток рассчитывает один вертекс или пиксель. От количества регистров, требуемых для выполнения шейдера, зависит максимальное количество одновременно выполняемых потоков. Например, на архитектуре Mali Midgard имеется следующая зависимость:
Дальнейшее увеличение потребности в регистрах приводит к записи промежуточных значений во временную память (так называемый register spilling). Иногда компилятор Mali может предпочесть небольшой register spilling переходу в менее выгодную конфигурацию потоков.
Оценить количество используемых регистров для Mali можно при помощи Mali Offline Compiler:
SurfaceView или TextureView
SurfaceView и TextureView оба наследуются от класса Android View, но между ними есть некоторые различия.
На сегодняшний день SurfaceView имеет класс наследник, который отлично работает с OpenGL и обеспечивает отличную производительность. Этот класс называется GLSurfaceView . Но главная проблема этого класса в том, что мы не можем перекрывать один GLSurfaceView другим. Следовательно, мы не можем использовать его в нашей иерархии лейаутов, и мы не можем преобразовывать, анимировать или масштабировать view таким образом.
TextureView ведет себя как обычный android.view.View , и вы можете анимировать, преобразовывать, масштабировать или даже наслаивать его с другими экземплярами. Но это преимущество дается на ценой потребления большего количества памяти, чем SurfaceView , и вы теряете в производительности (в среднем 1–3 кадра).
Возвращаясь к сути вопроса, поскольку мы хотели, чтобы наше кастомное view вело себя как обычное view Android, мы должны использовать TextureView .
Следующая проблема для нас заключается в том, что нет встроенного класса, который использует OpenGL render и TextureView . Но не спешите расстраиваться — GLSurfaceView подходит как раз для того, что нам нужно, но только с SurfaceView , поэтому давайте поразмыслим о том, как мы можем использовать этот класс для нашего собственного GLTextureView .
Шейдерные инструкции
Чтобы лучше ориентироваться в оптимизационных подходах, применяемых при написании шейдеров, полезно знать об основных категориях шейдерных инструкций. Первая категория — арифметические инструкции. Эти инструкции, как правило, работают с регистрами GPU и выполняются предсказуемое количество тактов. Обычно это 1 такт. При этом в современных конвейерах может выполняться по нескольку арифметических инструкций за 1 такт. Вторая категория — текстурные инструкции. Они осуществляют текстурную выборку — чтение из текстур с применением определенной фильтрации. Время выполнения этих инструкций значительно дольше, чем арифметических, и зависит от наличия запрашиваемых текселей в текстурном кэше. Современные архитектуры маскируют длительное время выполнения текстурных инструкций за счет переключения на другие шейдерные потоки и выполнения их арифметических инструкций. Рекомендуемое соотношение количества арифметических инструкций к текстурным может быть 10 к 1 и выше.
Кроме арифметических и текстурных инструкций, ещё выделяют Load & Store инструкции. К ним относятся, например, инструкции записи вершинных атрибутов в вершинном шейдере и чтение интерполированных значений этих атрибутов во фрагментном шейдере. Время выполнения таких инструкций больше, чем у арифметических, но меньше, чем у текстурных.
Приложения и папки в разделе данных
Итак, бегло окинув взглядом основные папки, мы отметили, что у нас нет доступа к загрузочным файлам, файлам восстановления и или системным файлам Android, когда мы просто просматриваем файлы при помощи браузера. Из чего следует утешительный вывод: нельзя просто так взять и вызвать своими действиями крах системы. Совсем другая ситуация возникает, когда у вас есть root-права. Так или иначе, с тем, что хранится в данном разделе, надо быть поаккуратнее: определенные приложения могут задействовать данные, которые здесь сохранены, и перемещение или удаление их может повлечь за собой нестабильную работу системы.
Теперь давайте посмотрим, что находится в разделе данных на вашем устройстве. Для того, чтобы это было возможно, в телефонах с Android версий Marshmallow или Nougat есть свой файловый менеджер, который дает доступ ко всему разделу. Эту опцию можно найти в меню Настройки- Память-Накопитель-Другое. Ряд аппаратов на более старых версиях Android могут иметь, а могут не иметь собственный файловый менеджер, зависит от производителя.
В качестве альтернативы есть множество сторонних приложений, доступных в Play Store, которые выполняют ту же самую роль, например, FX File Explorer или Total Commander.
Можно также управлять вашими файлами с вашего ПК при помощи подключения по USB. Стоит только удостовериться, что ваш телефон находится в режиме MTP (Передача файлов), чтобы вы могли видеть все свои файлы.
Получить доступ к памяти вашего устройства можно при помощи ПК или напрямую через файловый браузер
Если у вас есть ощущение, что память устройства выглядит переполненной и папок слишком много, приглядитесь к ним. Вы увидите многочисленные папки, связанные с приложениями, возможно, даже остатки от тех приложений, что вы уже удалили. Как правило, лучше не трогать никакие папки приложений, но если вы помните, что приложение было удалено, а папка от него осталась, ее удаление вреда не причинит. Скорее всего, она пустая или в ней остались какие-то бесполезные лог-файлы.
Даже если вы не устанавливали большого количества приложений, по умолчанию этот раздел с пользовательскими данными может содержать ряд папок – в них хранятся ваши контакты, музыка, картинки и все остальное. Вот самые основные папки, не связанные со сторонними приложениями, которые вы можете найти.
- Android – это место, куда по умолчанию сохраняются кэш приложений и данные. Эту папку не рекомендуется удалять, если вы не хотите потерять данные приложений. Удаление этой папки может привести к некорректной работе некоторых из них.
- Alarms, Ringtones, Notifications – как видно из названий, в этих папках хранятся аудиофайлы для будильников, рингтонов и уведомлений, которые могут быть использованы как дефолтными, так и сторонними приложениями.
- Cardboard – здесь хранятся данные для ряда приложений VR, а если таковых нет, она остается пустой.
- DCIM – здесь лежат фотографии, которые вы делали при помощи своего основного приложения камеры. Также вы можете увидеть такую папку и на карте microSD, если вы сохраняете фотографии и на нее.
- Downloads – здесь находится все, что скачано вами в веб-браузере, например, в Chrome или Firefox.
- Pictures, Music, Movies, Video – Это папки, которые по умолчанию используются вашими медиаприложениями. Некоторые приложения позволяют вам назначать другие папки, но большая часть медиаплееров по умолчанию будет использовать эти директории. Скриншоты чаще всего сохраняются в папке с картинками.
- Podcasts – Эта папка используется рядом приложений, чтобы отделять подкасты от остальных музыкальных файлов. Если вы не пользуетесь приложениями для прослушивания подкастов, она будет пустой.
ShaderView
Отлично, все, что нам нужно для нашего ShaderView, готово. Теперь мы можем использовать мощь фрагментного шейдера для рендеринга его содержимого! Создадим ShaderView.
Дополнительно: Использование текстур в фрагментных шейдерах
Приятно, что мы научились общаться и работать с фрагментными шейдерами, но во многих случаях вам приходится иметь дело с текстурами (например, для размытия или других видеоэффектов).
Вам нужно определить форму во фрагментном шейдере как sampler2D и получить текущий пиксель текстуры по координатам текстуры с помощью метода texture() из GLSL.
Вот полный код шейдера.
Затем нам понадобятся два расширения для загрузки и использования растрового изображения в качестве текстур OpenGL.
Теперь мы готовы загрузить текстуру из каталога ресурсов в виде растрового изображения (bitmap), используя loadBitmapForTexture() , а затем метод QuadRender.onSurfaceCreated() . Мы привяжем текстуру к слоту текстуры OpenGL (доступны слоты от GL_TEXTURE0 до GL_TEXTURE31 ).
Не забывайте утилизировать растровое изображение, когда оно вам больше не нужно.
После этого, мы устанавливаем эту текстуру в качестве активной и видимой для фрагментного шейдера в QuadRender.onDrawFrame() .
Полный код примера использования текстуры вы можете найти в этой ветке.
Ссылки
Исходный код этой статьи можно найти в моем репозитории.
С библиотекой ShaderView с помощью дружественного высокоуровневого API можно познакомиться здесь.
Также предлагаем посмотреть вебинары:
1) Рисуем свой график котировок в Android:
- Рассмотрим основные инструменты для рисования
- Изучим возможности классов Canvas, Path, Paint
- Нарисуем кастомизируемый график котировок и добавим в него анимаций
Привет Хабр! В предыдущих частях цикла (раз, два) мы рассматривали тайловую архитектуру мобильных GPU, а также классифицировали различные семейства GPU, представленные у пользователей. В этой части мы рассмотрим приемы, которые помогут писать быстрые шейдеры для мобильных GPU.
В мобильной экосистеме оптимальный код — всегда хорошо. Ведь даже в случае достижения требуемой частоты формирования кадров более оптимальный код позволяет переводить CPU и GPU на пониженные частоты, за счет чего снижается расход заряда и увеличивается среднее время сессий. Это, в свою очередь, положительно сказывается на доходе от игр со встроенной монетизацией.
Shaders — что это за папка? (Андроид)
Ребята, я покопался в интернете, прошустрил сайты и вот какие могу сделать выводы:
Папка Shaders хранит шейдеры игры или используется для их кэширования.
Можно ли удалить? Как понял — да, но при условии что директория для кэша. А если ее предназначение другое — то после удаления могут быть проблемы/ошибки в игре. Поэтому удалять без уверенности не стоит. Дело в том, что у одной игры она может быть например для кэша и удалить ее можно, а вот у другой использоваться еще для каких-то целей.. и после удаления вы возможно больше не сможете поиграть…
Если эта Shaders много весит, а раньше весила мало (когда игра уже стояла) — то да, может это и правда кэш. Кэш спокойно со временем может увеличиваться, это так бы сказать нормальное явление. ВАЖНО также то, что удаление папки — может расцениваться как вмешательство в игру, и может сработать некая защита (например бан), но это уже конечно от самой игры зависит.
От какой игры? Тут уже зависит какую вы ставили. Шейдеры используются почти во всех играх. Они нужны для определения параметров геометрических фигур, обьектов, созданий эффектов отражения, сдвига, преломления, затемнения и других вещей. То есть это то, что связано напрямую с игрой.
Например такую папку содержат игры NESDroid, Asphalt8, FIFA 14 by EA SPORTS, даже в знаменитой GTA IV такая папка есть.
Хотя один пользователь например эту папку удалил.. но она у него была от игры Real Racing 3… потом запустил игру и всей окей, папка создалась заново. Почему? Потому что скорее всего нужна была для кэша шейдеров. Тогда после удаления папки она будет восстановлена при следующем запуске игры.
Если Shaders пустая — советую ее не удалять, места она не занимает и телефон никак не грузит.
QuadRender
Следующий класс, который нам понадобится, — это класс рендеринга. Этот класс будет отрисовывать четырехугольник размера ShaderView с помощью шейдеров.
Четырехугольник OpenGL в проекции камеры. Камера — это точка зрения пользователя, который смотрит на устройство.
Наш класс должен расширить интерфейс GLTextureView.Renderer тремя методами:
onSurfaceCreated() — Создает программу шейдера, связывает некоторые параметры формы (uniform) и отправляет атрибуты в вершинный шейдер.
onDrawFrame() — Обновление на каждом кадре. В этом методе мы отрисовываем четырехугольник экрана и при необходимости обновляем параметры формы.
onSurfaceChanged() — Обновляет вьюпорт.
Итак, давайте будем писать код шаг за шагом. Я не буду вдаваться в подробное описание того, как работает OpenGL, потому что это выходит за рамки данной статьи. Я также хочу упомянуть, что мы фокусируемся только на фрагментном шейдере и не касаемся деталей вершинного шейдера, так как они должны быть одинаковыми практически для любых возможных требований фрагментного шейдера.
Две переменные, которые будут содержать исходный код наших вершинного и фрагментного шейдеров.
Определите список вершин для буфера вершин.
И добавить инициализацию в init<> блок.
Вершинный шейдер, атрибуты вершин и расположение матриц.
Локатор программы шейдера.
Отлично, мы закончили с инициализацией. Теперь давайте напишем метод onSurfaceCreated() . Мы загрузим и инициализируем наши шейдеры и получим указатели для атрибутов, включая параметр формы uMyUniform , который мы будем использовать для отправки некоторых пользовательских векторных данных во фрагментный шейдер.
Обратите внимание на последние три строки, где мы получаем расположение нашей кастомной формы ( uMyUniform ) для фрагментного шейдера. Для более сложных шейдеров нам придется добавить больше таких параметров.
В onSurfaceCreated() мы использовали специальные методы для создания и связывания программы.
Следующий метод, который мы должны реализовать, — это onDrawFrame() .
Обратите внимание на строки, в которых мы отправляем кастомное значение ( uMyUniformValue ) в форму ( uMyUniform ) во фрагментный шейдер.
И последнее, surfaceChange() — довольно простой метод.
Полный код этого класса вы можете найти здесь.
Трансцендентные функции в шейдерах
Архитектура конвейеров шейдерных ядер рассчитана на выполнение большого количества линейных преобразований. Типичные операции в компьютерной графике, такие как трансформация или рассчет освещения, в основном состоят из подобных операций. Из-за такой фокусировки для многих трансцендентных функций не делается «железной» реализации на чипе и вычисление значения может происходить при помощи полиномиальных приближений. Вычисление таких функций становится дорогостоящим. Приведем пример на PowerVR Rogue, для которого имеется официальный дизассемблер в PVRShaderEditor. Вычисление синуса компилируется в блок из нескольких инструкций, требующих 5 тактов на выполнение. В приведенном примере вычисление аргумента sin находится за пределами выделенной области. Примечательно, что в блоке находятся инструкции ветвления.
Намного хуже обстоят дела с обратными тригонометрическими функциями. Пример вычисления арксинуса:
Осторожность стоит соблюдать со всеми трансцендентными функциями. Даже те из них, которые обычно реализованы в железе, например, натуральный логарифм (log), часто требуют выделенный такт на свое выполнение и не пакуются вместе с другими инструкциями.
Фрагментный/пиксельный шейдер (Fragment Shader)
Код довольно прост, но давайте посмотрим, что у нас здесь есть.
Прежде всего, мы определяем версию GLSL.
Определяем параметры ввода и вывода для нашего фрагментного шейдера. In — что мы получаем от вершинного шейдера (в нашем случае координаты текстуры), а out — что отправляем в результате (цвет пикселя).
Теперь напишем функцию, которая будет выполняться для каждого пикселя нашего Android View и возвращать его цвет.
В результате мы получим следующее:
Читайте также: