GlDrawElements vs glDrawArray eficiencia

Estoy haciendo un juego para iOS y Android. He visto en muchos lugares que el dibujo utilizando índices es más eficiente que el dibujo de triángulos.

La cosa es que estoy usando vértices comprimidos con pérdidas (como el formato de archivo del md2) y toma menos que sólo los índices solos – Array: N * 3 (xyz) * 1 (uchar) + translate (12 bytes) + scale 12 bytes). Elemento: N * 3 (xyz) * 4 (uint) + Array / ~ 10

Parece que la matriz es incluso mejor opción que el elemento indexado y comprimido, aunque la herramienta de perfiles OpenGL de Apple dice que debo usar glDrawElements.

¿La implementación de OpenGL prefiere matriz indexada? O es porque la matriz indexada contiene menos datos que la matriz regular descomprimida?

Ps Estoy usando OpenGL es 2.0 y el vertex shader es el que descomprime los vértices.

¿Está utilizando Vertex Arrays o Vertex Buffer Objects? Si está utilizando Vertex Arrays, es posible que desee considerar la posibilidad de buscar glDrawRangeElements en lugar de glDrawElements .

A menos que todos tus polys tengan vértices distintos (bastante improbable), glDrawElements será más rápido que glDrawArray porque glDrawElements aprovechará el hecho de que los vértices repetidos se cargarán en el caché de gpu y no tendrán que cargarse más de una vez para cada uno Poli que ese vértice es una parte de. Sin embargo, con glDrawArray , glDrawArray a través de la matriz y no podrá asociar vértices similares, por lo que tendrá que cargarlos varias veces.

Sin embargo, siempre depende de su situación específica. Trate de usar un generador de perfiles o obtener una velocidad de fotogramas utilizando cada uno de estos métodos. No debería ser demasiado difícil cambiar entre ellos. Si uno es claramente mejor, utilice uno. Si ninguno de los dos es excepcionalmente mejor, entonces probablemente no importa demasiado.

Recuerde, la optimización prematura es la raíz de todo mal. ¡Buena suerte! 🙂

El uso de glDrawElements() ahorrará una cantidad sustancial de memoria y podrá especificar los elementos de la matriz en cualquier orden.

Usando glDrawArrays() , sin embargo, su única opción es iterar secuencialmente sobre la lista.

Tienes que experimentar.

  • Invoca selector de fechas nativo de la aplicación web en iOS / Android
  • ¿Existe algún marco que funcione en Android y iPhone?
  • Cuán exacta es la medida de altitud en los teléfonos móviles
  • El hack de la casilla de verificación de Android causa el traslado del sitio en el iPhone
  • Reproducción de audio html5 en el navegador android
  • Titanio api.info nunca muestra nada en la consola
  • Tarjeta de crédito con tarjeta de crédito
  • Reutilización de diseños de Android
  • ¿Existe alguna buena API de OCR para iPhone y / o teléfonos Android?
  • Automatización de pruebas de iPhone - herramientas de referencia?
  • Certificación FIPS para Android y iPhone
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.