Оптимизация шейдеров для экрана Retina на iOS - PullRequest
5 голосов
/ 30 марта 2012

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

1 Ответ

9 голосов
/ 30 марта 2012

Если вы выполняете рендеринг с кадровым буфером при полном разрешении дисплея 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).

...