2010-09-26 6 views
9

Я хотел бы сделать игру из многих кубов и планирую разместить ее на мобильных платформах, а также в Интернете с помощью webgl. Моя проблема в том, что когда я делаю вызов drawelements на кубе, я беру удар по частоте кадров. Есть ли способ, которым я могу сделать один призыв к призыву, чтобы нарисовать их? Единственное различие между кубами - это положение и цвет.Самый эффективный способ рисования нескольких одинаковых объектов?

+0

Являются ли позиции кубов относительно друг друга со временем меняющимися? – LarsH

+0

Они со временем меняются, так как мне нужны разрушаемые объекты. – Xavier

+0

См. Также: http://stackoverflow.com/questions/9352355/draw-many-of-the-same-object-quickly-in-opengl – jwrush

ответ

4

Я столкнулся с той же проблемой. Я задал подобный вопрос и сам ответил вчера. Посмотрите на:

Efficient way of drawing in OpenGL ES

Вы хотите создать вершинные буферы и загружать их в память видеокарты только один раз gl.bufferData. Затем используйте ссылку на этот буфер каждый раз, когда вы выполняете gl.drawElements или gl.drawArrays. До следующего раза, когда содержимое 3D-сцены изменится, вы можете использовать этот буфер, который загружается в память графической карты.

0

Следуйте модели UITableView в том, как они деактивируют ячейки. Я бы построил объект, который отслеживает объекты, которые вы нарисовали, и связывает их с идентификатором. Затем вы можете просто удалить их с указанным идентификатором. Если вы знаете, что собираетесь рисовать много версий одного и того же объекта, используйте этот объект для минимизации рендеринга/распределения.

0

Если вы используете массивы Vertex для glDrawElements(), я бы предложил вместо этого использовать объекты буфера вершин. Это будет хранить сторону сервера данных (в GRAM) вместо клиентской стороны (в системной памяти). Таким образом вы можете сделать вызовы glDrawElements() с гораздо меньшим количеством CPU < -> Накладные расходы на передачу данных GPU.

В качестве альтернативы вы можете хранить кубы в списках отображения. Таким образом, вы можете использовать glTranlate() для перемещения куба, а затем просто вызвать список отображения, чтобы отобразить его. Единственное предостережение от использования отображаемых списков состоит в том, что все, что вы делаете в списке отображения, является неизменным; вы не можете изменять вызовы в списке отображения без полной перекомпиляции.

+2

OpenGL ES не поддерживает списки отображения. –

Смежные вопросы