Повернуть отдельные полигоны в массиве вершин Open GL? - PullRequest
2 голосов
/ 27 сентября 2010

Я работаю над игрой для Android, использующей OpenGL ES, и у меня возникла проблема с производительностью.

Что я пытаюсь сделать : у меня куча объектов наэкран, который все имеют одну и ту же сетку, но все имеют отдельные повороты и переводы.Вы можете сравнить его с астероидами, где у вас на экране движется куча астероидов.

Актуальная проблема : я беру производительность, потому что я вращаю и перемещаю каждый объект индивидуальнонакладные расходы на отправку массива вершин слишком велики по сравнению с количеством вершин (десятков из них на объект).

Что я могу сделать?Одно из решений, о котором я подумал, - это самостоятельно обновить вершины в программном обеспечении, прежде чем помещать их в буфер вершин.Это, вероятно, избавило бы меня от лишних затрат, но это кажется нелогичным.

Пожалуйста, поделитесь любыми идеями или предложениями, которые могут у вас возникнуть!Спасибо!

1 Ответ

1 голос
/ 28 сентября 2010

«накладные расходы на отправку массива вершин» означают, что вы не используете серверные буферы для вершин / индексов.Если это так, взгляните на раздел 2.9 спецификации GLES 1.1, «Объекты буфера».

Конечно, даже если вы используете буферы на стороне сервера, достаточно много небольших вызовов glDrawElementsможет легко стать узким местом в производительности.

Если все ваши объекты статичны, вы можете просто предварительно преобразовать их все и заплатить Nx памяти на сервере.

Если ваши объекты динамические, вещиболее сложны.Рисование "Instanced" (см., Например, DrawInstanced * в Direct-X) может помочь, но я не верю, что в GLES есть что-то подобное (рисование "instances" также сохранит память в статическом случае).

Используя GLES 2.0, вы можете попробовать что-то вроде:

  • поместить M копий меша в буфер вершин, давая каждой вершине дополнительный атрибут, который является индексом копии
  • ввершинный шейдер, загрузите матрицу преобразования (или ее подраздел, если некоторые из них фиксированные) из единого массива, индексированного дополнительным атрибутом

Тогда вы можете сделать N / M glDrawElements вызовы, каждый раз устанавливая M матриц в единый массив.Не ясно, что это будет на самом деле быстрее, поскольку (для одного) аппаратное обеспечение должно работать больше (индексированные формы не являются супер-дешевыми).Кроме того, я не думаю, что подобное возможно в GLES 1.1.

...