#ios #ipad #optimization #rendering #opengl-es-2.0
#iOS #iPad #оптимизация #рендеринг #opengl-es-2.0
Вопрос:
Возможно ли оптимизировать рисование OpenGL ES 2.0 с использованием грязных прямоугольников?
В моем случае у меня есть 2D-приложение, которому необходимо нарисовать текстуру фона (на весь экран на iPad), за которой следует содержимое нескольких VBO в каждом кадре. Проблема в том, что эти VBO потенциально могут содержать миллионы вершин, и для вывода всего на дисплей требуется до пары секунд. Однако на самом деле каждый кадр будет обновляться лишь небольшая часть изображения.
Возможна ли такая оптимизация и как (или, возможно, более уместно, где) это будет реализовано? Нужно ли передавать какую-либо плоскость отсечения в вершинный шейдер?
Ответ №1:
Если вы задаете область с помощью glViewport
, обрезка настраивается соответствующим образом. Однако это происходит после этапа вершинного шейдера, непосредственно перед растеризацией. Поскольку GL не может знать результат вашей собственной программы vertex, он не может отсортировать какую-либо вершину перед применением программы vertex. После этого это происходит. Насколько это эффективно, зависит от фактического графического процессора.
Таким образом, вам нужно отсортировать и разделить ваши объекты на меньшие (например. прямоугольные (ограниченные) плитки и самостоятельно протестируйте их в поле зрения для достижения полной производительности.
Комментарии:
1. Спасибо за ответ. Просто для проверки — вы говорите, что простая настройка области просмотра даст некоторые преимущества в производительности; если я хочу наилучшую оптимизацию, мне нужно будет проверять границы каждого элемента и рисовать только те, которые попадают в грязный прямоугольник? Прав ли я, полагая, что фрагментный шейдер обычно использует больше вычислительной мощности, чем вершинный шейдер? Я, конечно, протестирую это, но мне интересно, представляете ли вы, какую выгоду я получу, отбросив 95% вершин на этапе обрезки?
2. Настройка области просмотра устраняет большинство фрагментов для рисования. Однако графический процессор предназначен для рисования всего экрана с приличной частотой кадров, поэтому это может быть не вашим узким местом, если у вас есть «пара секунд». Таким образом, настройка области просмотра — простая, но слабая оптимизация. Итак, я думаю, вам нужно избавиться от большей части обработки вершин при каждой перерисовке. Вы также не хотите проверять миллионы вершин процессором. Таким образом, простым решением было бы нарезать вашу геометрию на плитки, например, 64×64 пикселей, и рисовать только те, к которым прикоснулись.
3. Большую часть времени вершины отображаются (в виде мазков «кистью») в текстуре, и я легко получаю 60 кадров в секунду, однако время от времени мне нужно будет перерисовывать штрихи для каждой вершины и выполнять тестирование трафарета. «Пара секунд» возникает только при рисовании несколько избыточного (по определению пользователя) количества вершин из VBO, однако я хочу сохранить производительность на уровне или выше 20 кадров в секунду, где это возможно. Разбиение таких данных на плитки в этом случае нетривиально (разные текстуры, VBO переменного размера … и т.д.), Однако я уверен, что если отсечения недостаточно, это будет. Большое спасибо за помощь.