Rápido vértices dinámicos en OpenGL ES 2.0 en Android

Estoy tratando de lotes dibujar un montón de líneas en Android con OpenGL ES 2.0 y necesito saber la mejor manera de hacer esto.

En este momento hice una clase llamada LineEngine que construye un FloatBuffer de todos los vértices para dibujar y luego dibuja todas las líneas a la vez. El problema es que aparentemente FloatBuffer.put () es muy lento y está devorando el tiempo de CPU como loco.

Esta es mi clase

public class LineEngine { private static final float[] IDENTIY = new float[16]; private FloatBuffer mLinePoints; private FloatBuffer mLineColors; private int mCount; public LineEngine(int maxLines) { Matrix.setIdentityM(IDENTIY, 0); ByteBuffer byteBuf = ByteBuffer.allocateDirect(maxLines * 2 * 4 * 4); byteBuf.order(ByteOrder.nativeOrder()); mLinePoints = byteBuf.asFloatBuffer(); byteBuf = ByteBuffer.allocateDirect(maxLines * 2 * 4 * 4); byteBuf.order(ByteOrder.nativeOrder()); mLineColors = byteBuf.asFloatBuffer(); reset(); } public void addLine(float[] position, float[] color){ mLinePoints.put(position, 0, 8); //These lines mLineColors.put(color, 0, 4); // are taking mLineColors.put(color, 0, 4); // the longest! mCount++; } public void reset(){ mLinePoints.position(0); mLineColors.position(0); mCount = 0; } public void draw(){ mLinePoints.position(0); mLineColors.position(0); GraphicsEngine.setMMatrix(IDENTIY); GraphicsEngine.setColors(mLineColors); GraphicsEngine.setVertices4d(mLinePoints); GraphicsEngine.disableTexture(); GLES20.glDrawArrays(GLES20.GL_LINES, 0, mCount * 2); GraphicsEngine.disableColors(); reset(); } } 

¿Hay una mejor manera de agrupar todas estas líneas juntos?

Lo que usted está tratando de hacer se llama SpriteBatching. Si desea que su programa sea robusto en OpenGL es, debe comprobar lo siguiente (una lista de lo que hace que su programa sea lento):

-Cambiar a muchos estados de opengl ES cada frame.

-Enable // Dable (texturas, etc.) una y otra vez. Una vez que habilitas algo que no tienes que hacerlo de nuevo se aplicará automáticamente su marco.

-Usar a muchos activos en lugar de spriteSheets. Sí thats hacer un enorme impacto en el rendimiento. Por ejemplo, si usted tiene 10 imágenes que tiene que cargar para cada imagen una textura diferente y que es LENTO. Una manera mejor de hacer esto es crear un spriteSheet. (Puedes comprobar google para los creadores libres del spriteSheet).

-Tus imágenes son de alta calidad. ¡Sí! Compruebe su resolución y extensión de archivo. Preferir archivos .png.

-Care para el api 8 búfer de búfer float (usted tiene que utilizar el búfer del int en lugar de fijar el bicho).

-Usar contenedores java. Esta es la mayor falla, si se utiliza la concatenación de cadenas (que no es un contenedor sino que devuelve una nueva cadena cada vez) o una lista o cualquier otro contenedor que vuelve lenta debido a la recolección de basura. Para la manipulación de entrada le sugiero que busque un teqnique llamado la clase de piscina. Su uso es reciclar objetos en vez de crear nuevos. Recolector de basura es el gran enemigo, tratar de hacerlo feliz y evitar cualquier técnica de programación que podría llamarlo.

-Nunca cargue las cosas sobre la marcha, en lugar de hacer una clase cargador y cargar todos los activos necesarios en el inicio de la aplicación.

Si implementa esta lista entonces sus posibilidades son su programa será robusto.

Una última adición. ¿Qué es un lector de sprite? Un spriteBatcher es una clase que usa una sola textura para renderizar varios objetos. Se creará automáticamente vértices, índices, colores, u – v coords y se los hará como un lote. Este patrón ahorrará energía de la GPU así como poder de la CPU. De su código publicado no puedo estar seguro de lo que hace que la CPU a ralentizar, pero de mi experiencia se debe a una (o más) las cosas de la lista que mencioné anteriormente. Revise la lista, sígalo, busque google para spriteBatching y estoy seguro de que su programa se ejecutará rápido. Espero que ayudó!

Editar: Creo que he encontrado lo que hace que su programa para reducir la velocidad, que no voltear el amortiguador dude! Acaba de restablecer la posición. Usted apenas agrega agrega agrega más objetos y usted causa la sobrecarga del almacenador intermediario. En el método de reinicio, basta con voltear el búfer. MLineColors.flip mLinePaints.flip hará el trabajo. Asegúrese de llamarlos cada fotograma si envía nuevos verbos cada fotograma.

FloatBuffer.put (float []) con una matriz de flotación relativamente grande debe ser considerablemente más rápido. Las llamadas individuales (float) tienen un montón de gastos generales.

Sólo tiene que ir para una función nativa muy simple que se llamará de su clase. Usted puede poner float[] a OpenGL directamente, no hay necesidad de matar el tiempo de CPU con una interfaz de búfer tonto.

  • Cómo agregar palabras clave para optimizar la búsqueda de mi aplicación Android en google play store
  • ¿Problemas comunes de rendimiento en Android?
  • Cómo recortar un java stringbuilder?
  • APK no se instalará: DalvikVM no puede optimizarlo (el intercambio de bytes y la verificación fallan)
  • ¿Es posible minimizar todas las funciones de Android Studio a la vez?
  • Cómo inhabilitar Doze para una aplicación?
  • ¿La manera más rápida de leer largo del archivo?
  • Optimización de la aplicación de Android antes del lanzamiento
  • OpenGL en Android versus iOS: optimizaciones, y donde difieren
  • ¿Por qué esto no funciona a veces?
  • Desempeño de Android: "Evita los internos y los setters"
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.