iOS: «сырые» glDrawArrays против VBO + glUniform - PullRequest
0 голосов
/ 21 марта 2012

В моем 2D-движке iOS OpenGL я в настоящее время рисую все, создавая массив с плавающей запятой в ЦП, заполненный точками координат блока объекта, который я хочу нарисовать, вызывая glVertexAttribPointer, используя этот массив, а затем glDrawArrays. Это работает отлично и довольно быстро даже для многих объектов. Профилировщик iOS OpenGL не очень доволен этим. Он рекомендует использовать VBO. Причина, по которой я не использовал их с самого начала, заключается в том, что ничто не было достаточно «статичным», чтобы VBO имел смысл. Природа этого движка настолько динамична, что я не могу ничего «кэшировать». Объекты могут быть любого размера, масштаба и поворачиваться на любой угол в любой момент времени. Я знаю, что использование моего текущего метода не очень хорошо и что оно предназначено для рисования пакетов - но до сих пор оно работало просто отлично.

Вопрос только в том, будет ли быстрее использовать VBO размером 1x1 и затем изменять его внешний вид, устанавливая однородную матрицу вместо простого вычисления точек вершины на ЦП? Это только 4 балла для расчета на объект, который я хочу нарисовать. Я просто не знаю, происходит ли обновление унифицированного значения быстрее, чем передача вершин в графический процессор. Перенос точек вершин из CPU в GPU занимает 8 операций. Передача новой матрицы преобразования составляет 16 операций с плавающей запятой (матрица 4х4). Таким образом, преимущество обновления униформы по данным вершин больше, чем оправдание двойной передачи данных?

Существуют ли лучшие / более быстрые способы рисования множества постоянно меняющихся объектов?

...