2010-09-26 12 views
9

Me gustaría hacer un juego de muchos cubos y planeo ponerlo en plataformas móviles y también en la web usando webgl. Mi problema es que cuando realizo una llamada de drawelements por cubo, aprieto la velocidad de fotogramas. ¿Hay alguna manera de hacer una sola llamada a OpenGL para dibujar? La única diferencia entre los cubos sería posición y color.¿La manera más eficiente de dibujar objetos idénticos múltiples?

+0

¿Las posiciones de los cubos entre sí van a cambiar con el tiempo? – LarsH

+0

Posiblemente cambien con el tiempo, ya que me gustaría objetos destructibles. – Xavier

+0

Vea también: http://stackoverflow.com/questions/9352355/draw-many-of-the-same-object-quickly-in-opengl – jwrush

Respuesta

4

Me encontré con el mismo problema yo mismo. Hice una pregunta similar y la respondí ayer mismo. Echar un vistazo a:

Efficient way of drawing in OpenGL ES

desea crear sus buffers de vértices y cargarlas en memoria de tarjeta gráfica solamente una vez usando gl.bufferData. Luego use referencia a ese buffer cada vez que haga gl.drawElements o gl.drawArrays. Hasta la próxima vez que cambie el contenido de su escena 3D, puede usar este búfer cargado en la memoria de la tarjeta gráfica.

0

Sigue el modelo de UITableView en cómo dequeue las celdas. Construiría un objeto que realiza un seguimiento de los objetos que ha dibujado y los vincula a un Identificador. Luego, simplemente puede quitarlos de la cola con dicho identificador. Si sabe que va a dibujar muchas versiones del mismo objeto, use ese objeto para minimizar la representación/las asignaciones.

0

Si está utilizando matrices de vértice para sus glDrawElements(), le sugiero que utilice Objetos de búfer de vértice. Esto almacenará el lado del servidor de datos (en GRAM) en lugar del lado del cliente (en la RAM del sistema). De esta forma puede hacer llamadas glDrawElements() con mucho menos CPU < -> gastos generales de transferencia de datos GPU.

Como alternativa, puede almacenar sus cubos en listas de visualización. De esta forma podría usar glTranlate() para mover un cubo y luego simplemente llamar a la lista de visualización para renderizarlo. La única advertencia para usar listas de visualización es que haga lo que haga en la lista de visualización es inmutable; no puede cambiar las llamadas en la lista de visualización sin recompilarlo por completo.

+2

OpenGL ES no admite listas de visualización. –

Cuestiones relacionadas