Оптимизация шейдеров для экрана Retina на iOS

Я делаю 3D приложение для iPhone, которое использует много рекламных щитов. Мой буфер кадров в два раза больше на экране Retina, потому что я хочу повысить их качество на iPhone 4. Проблема в том, что фрагментные шейдеры потребляют гораздо больше времени из-за размера кадрового буфера. Есть ли способ управлять экраном сетчатки и текстурами высокой четкости без повышения точности шейдера?

Ответы на вопрос(1)

Решение Вопроса

дисплея Retina, у него будет в четыре раза больше пикселей на растр по сравнению с той же физической областью дисплея без Retina. Если у вас ограничена скорость заполнения из-за сложности ваших шейдеров, это приведет к тому, что каждый кадр будет рендериться намного дольше.

Во-первых, вы захотите убедиться, что вы действительно ограничены частью обработки фрагмента конвейера рендеринга. Запустите инструмент OpenGL ES Driver для своего приложения и посмотрите статистику использования Tiler и Renderer. Если коэффициент использования рендерера близок к 100%, это означает, что вы ограничены фрагментными шейдерами и вашей общей способностью выдвигать пиксели. Однако, если вы видите процент использования Tiler там, это означает, что вы ограничены геометрией, и изменения в разрешении экрана не будут влиять на производительность так же, как уменьшение сложности и размера ваших данных вершин.

Предполагая, что вы ограничены вашими фрагментными шейдерами, есть несколько вещей, которые вы можете сделать, чтобы значительно повысить производительность графических процессоров iOS.

В вашем случае кажется, что размер текстуры может быть проблемой. Первое, что я хотел бы сделать, это использовать текстуры PowerVR Texture Compressed (PVRTC) вместо стандартных растровых источников. Текстуры PVRTC хранятся в сжатом формате в памяти и могут быть намного меньше, чем эквивалентные растровые изображения. Это может обеспечить гораздо более быстрый доступ за счет увеличения попаданий в кэш при чтении текстур.

Сделайте ваши текстуры размером в два и включите мипмапы. Я видел, как мипмапы действительно помогают для больших текстур, которые часто уменьшаются, чтобы появляться на более мелких объектах. Это определенно звучит как случай для вашего приложения, которое может нуждаться в поддержке устройств Retina и других устройств.

Избегайте зависимого чтения текстур в ваших фрагментных шейдерах, таких как чума. Все, что выполняет вычисление для определения координаты текстуры, или любое чтение текстуры, попадающее в оператор ветвления, запускает чтение зависимой текстуры, которое может быть более чем на порядок медленнее для выполнения на графических процессорах iOS. Во время обычного чтения текстур графические процессоры PowerVR могут немного читать перед значениями текстур, но если вы используете вызывающее чтение текстур, вы можете потерять эту оптимизацию.

Я мог бы продолжить о различных оптимизациях (используя lowp или mediump точность вместо highp, где это уместно и т. Д.), Яимел небольшую помощь в этой области самНо, похоже, это первое, на чем я бы сосредоточился. Наконец, вы также можете попробовать запустить ваши шейдеры черезРедактор профилирования PowerVR который может дать вам оценки времени цикла для лучшей и худшей производительности этих шейдеров.

Устройства отображения Retina не являются даже худшими нарушителями, когда речь идет об ограничениях фрагментов шейдеров. Попробуйте сделать что-то рендеринг на весь экран iPad 1, чтобы быть производительным, потому что у него больше пикселей, чем у iPhone 4 / 4S, но гораздо медленнее GPU, чем у iPad 2/3 или iPhone 4S. Если вы сможете заставить что-то хорошо работать на iPad 1, это будет хорошо для всего остального (даже для Retina iPad).

 Klem02 апр. 2012 г., 11:45
Спасибо за всю эту точность. Коэффициент использования рендеринга составляет около 99%, а Tiler - около 5%. Я думаю, что mipmapping не улучшит производительность, потому что большинство моих рекламных щитов отображаются как 2D-спрайты (текстуры не масштабируются). Я попробую редактор профилирования PowerVR и протестирую свое приложение на iPad 1.
 badweasel01 мар. 2014 г., 00:42
Спасибо бред. Последние 6 месяцев я кодировал шейдеры как сумасшедшие, и когда я узнал, как изменять координаты текстуры, это было похоже на включение света в моем мозгу. Но в последнее время меня интересует, лучше ли читать по двум разным текстурам, или разбивать базовые карты и карты нормалей на одну текстуру. Который быстрее. Руководство Apple по рекомендациям для шейдеров подразумевает, что если модификация texcoord выполняется в вершинном шейдере, это не является зависимым чтением текстуры. Я собираюсь попробовать это, чтобы увидеть, ускоряется ли рендеринг iphone4. И, возможно, попробуйте разные карты тоже.

Ваш ответ на вопрос