«накладные расходы на отправку массива вершин» означают, что вы не используете серверные буферы для вершин / индексов.Если это так, взгляните на раздел 2.9 спецификации GLES 1.1, «Объекты буфера».
Конечно, даже если вы используете буферы на стороне сервера, достаточно много небольших вызовов glDrawElements
может легко стать узким местом в производительности.
Если все ваши объекты статичны, вы можете просто предварительно преобразовать их все и заплатить Nx памяти на сервере.
Если ваши объекты динамические, вещиболее сложны.Рисование "Instanced" (см., Например, DrawInstanced
* в Direct-X) может помочь, но я не верю, что в GLES есть что-то подобное (рисование "instances" также сохранит память в статическом случае).
Используя GLES 2.0, вы можете попробовать что-то вроде:
- поместить M копий меша в буфер вершин, давая каждой вершине дополнительный атрибут, который является индексом копии
- ввершинный шейдер, загрузите матрицу преобразования (или ее подраздел, если некоторые из них фиксированные) из единого массива, индексированного дополнительным атрибутом
Тогда вы можете сделать N / M glDrawElements
вызовы, каждый раз устанавливая M матриц в единый массив.Не ясно, что это будет на самом деле быстрее, поскольку (для одного) аппаратное обеспечение должно работать больше (индексированные формы не являются супер-дешевыми).Кроме того, я не думаю, что подобное возможно в GLES 1.1.