Construir una caja con textura en un lado en libgdx – rendimiento

En un juego de scrabble-como 3D tengo un problema de rendimiento de obtener sólo 8 FPS. Lo redujo a los azulejos de la carta. Hay 100 de ellos y la disminución de su número mejora el rendimiento rápidamente. He descartado la vinculación de la textura porque la velocidad no mejora incluso cuando todos los azulejos tienen la misma textura como en la captura de pantalla.

captura de pantalla

Así es como creo cada cuadro:

public static void createModel() { matWhite = new Material(ColorAttribute.createDiffuse(Color.WHITE)); ModelBuilder modelBuilder = new ModelBuilder(); modelBuilder.begin(); MeshPartBuilder tileBuilder; tileBuilder = modelBuilder.part("top", GL10.GL_TRIANGLES, Usage.Position | Usage.Normal | Usage.TextureCoordinates, matWhite); tileBuilder.rect(-0.45f, 0.1f, 0.45f, 0.45f, 0.1f, 0.45f, 0.45f, 0.1f, -0.45f, -0.45f, 0.1f, -0.45f, 0f, 1f, 0f); tileBuilder = modelBuilder.part("bottom", GL10.GL_TRIANGLES, Usage.Position | Usage.Normal, matWhite); tileBuilder.rect(-0.45f, 0f, -0.45f, 0.45f, 0f, -0.45f, 0.45f, 0f, 0.45f, -0.45f, 0f, 0.45f, 0f, -1f, 0f); tileBuilder = modelBuilder.part("front", GL10.GL_TRIANGLES, Usage.Position | Usage.Normal, matWhite); tileBuilder.rect(-0.45f, 0.1f, 0.45f, -0.45f, 0f, 0.45f, 0.45f, 0f, 0.45f, 0.45f, 0.1f, 0.45f, 0f, 0f, 1f); tileBuilder = modelBuilder.part("left", GL10.GL_TRIANGLES, Usage.Position | Usage.Normal, matWhite); tileBuilder.rect(-0.45f, 0.1f, 0.45f, -0.45f, 0.1f, -0.45f, -0.45f, 0f, -0.45f, -0.45f, 0f, 0.45f, -1f, 0f, 0f); tileBuilder = modelBuilder.part("right", GL10.GL_TRIANGLES, Usage.Position | Usage.Normal, matWhite); tileBuilder.rect( 0.45f, 0.1f, 0.45f, 0.45f, 0f, 0.45f, 0.45f, 0f, -0.45f, 0.45f, 0.1f, -0.45f, 0f, 0f, 1f); tileBuilder = modelBuilder.part("back", GL10.GL_TRIANGLES, Usage.Position | Usage.Normal, matWhite); tileBuilder.rect(-0.45f, 0.1f, -0.45f, 0.45f, 0.1f, -0.45f, 0.45f, 0f, -0.45f, -0.45f, 0f, -0.45f, 0f, 0f, 1f); modelTile = modelBuilder.end(); } public void createModelInstance(com.badlogic.gdx.assets.AssetManager assetManager) { Texture texTile = assetManager.get("textures/" + textureFile + ".jpg", Texture.class); Material mat = new Material(TextureAttribute.createDiffuse(texTile)); modelInstance = new ModelInstance(modelTile); modelInstance.nodes.get(0).parts.get(0).material.set(mat); } 

Mientras experimentaba, encontré que la velocidad sube hasta 25 FPS (incluso con las 100 texturas que se utilizan) si reemplazo el código de construcción de la parte de malla con la creación de una caja simple (que muestra la textura en todos los lados por lo que no es muy útil para este juego ). Su método createBox también llama rect () 6 veces, pero hasta ahora no puedo ver la diferencia.

 modelTile = modelBuilder.createBox(0.9f, 0.1f, 0.9f, matWhite, Usage.Position | Usage.Normal | Usage.TextureCoordinates); 

¿Qué estoy haciendo mal en el primer código? ¿Cuál sería la forma correcta de crear una caja con textura sólo en un lado?

Cada vez que llame a modelBuilder.part , implica una llamada de llamada. Ya que son bastante caros, que realmente quiere mantener el número de llamar a llamar a un mínimo. Además, puesto que tiene diferentes atributos de vértice, tendrá que cambiar malla y sombreado entre la primera y otras partes. También querrá mantener el número de conmutadores de malla y shader a un mínimo.

Por lo tanto, para empezar a optimizar es probable que desee combinar las partes con los mismos atributos:

 tileBuilder = modelBuilder.part("top", GL10.GL_TRIANGLES, Usage.Position | Usage.Normal | Usage.TextureCoordinates, matWhite); tileBuilder.rect(-0.45f, 0.1f, 0.45f, 0.45f, 0.1f, 0.45f, 0.45f, 0.1f, -0.45f, -0.45f, 0.1f, -0.45f, 0f, 1f, 0f); tileBuilder = modelBuilder.part("others", GL10.GL_TRIANGLES, Usage.Position | Usage.Normal, matWhite); tileBuilder.rect(-0.45f, 0f, -0.45f, 0.45f, 0f, -0.45f, 0.45f, 0f, 0.45f, -0.45f, 0f, 0.45f, 0f, -1f, 0f); tileBuilder.rect(-0.45f, 0.1f, 0.45f, -0.45f, 0f, 0.45f, 0.45f, 0f, 0.45f, 0.45f, 0.1f, 0.45f, 0f, 0f, 1f); tileBuilder.rect(-0.45f, 0.1f, 0.45f, -0.45f, 0.1f, -0.45f, -0.45f, 0f, -0.45f, -0.45f, 0f, 0.45f, -1f, 0f, 0f); tileBuilder.rect( 0.45f, 0.1f, 0.45f, 0.45f, 0f, 0.45f, 0.45f, 0f, -0.45f, 0.45f, 0.1f, -0.45f, 0f, 0f, 1f); tileBuilder.rect(-0.45f, 0.1f, -0.45f, 0.45f, 0.1f, -0.45f, 0.45f, 0f, -0.45f, -0.45f, 0f, -0.45f, 0f, 0f, 1f); 

Y para optimizar aún más (eliminando todos los conmutadores de malla), puede utilizar los mismos atributos de vértice. Por supuesto, esto agregará atributos de textura a los lados sin una textura. Pero siempre y cuando el material no tenga una textura, serán ignorados.

 tileBuilder = modelBuilder.part("top", GL10.GL_TRIANGLES, Usage.Position | Usage.Normal | Usage.TextureCoordinates, matTop); tileBuilder.rect(-0.45f, 0.1f, 0.45f, 0.45f, 0.1f, 0.45f, 0.45f, 0.1f, -0.45f, -0.45f, 0.1f, -0.45f, 0f, 1f, 0f); tileBuilder = modelBuilder.part("others", GL10.GL_TRIANGLES, Usage.Position | Usage.Normal | Usage.TextureCoordinates, matOthers); tileBuilder.rect(-0.45f, 0f, -0.45f, 0.45f, 0f, -0.45f, 0.45f, 0f, 0.45f, -0.45f, 0f, 0.45f, 0f, -1f, 0f); ... 

Para optimizar aún más (eliminando todos los shader switches y reduciendo el número de llamadas de draw), puede agregar un solo píxel a la textura que será utilizado por los lados y establecer el rango de UV segúnle:

 tileBuilder = modelBuilder.part("top", GL10.GL_TRIANGLES, Usage.Position | Usage.Normal | Usage.TextureCoordinates, matWhite); tileBuilder.setUVRange(0,0,1,1); tileBuilder.rect(-0.45f, 0.1f, 0.45f, 0.45f, 0.1f, 0.45f, 0.45f, 0.1f, -0.45f, -0.45f, 0.1f, -0.45f, 0f, 1f, 0f); tileBuilder.setUVRange(0,0,0,0); // Assumes the top left pixel is the correct color for the other sides tileBuilder.rect(-0.45f, 0f, -0.45f, 0.45f, 0f, -0.45f, 0.45f, 0f, 0.45f, -0.45f, 0f, 0.45f, 0f, -1f, 0f); ... 

Ahora, si todavía experimenta problemas de rendimiento, puede considerar combinar varios mosaicos en un solo modelo (parte: llamar a llamar). Pero eso probablemente no es necesario inmediatamente con los cambios anteriores.

Más información: http://blog.xoppa.com/behind-the-3d-scenes-part1/

  • Renderización SVG con OpenGL (y OpenGL ES)
  • Cómo crear un mapa interactivo en Android
  • ¿Qué es JNI Graphics o cómo usarlo?
  • Cómo mejorar el rendimiento de la representación de ping-pong (para desenfoque) en OpenGL ES
  • Determinación del límite de tamaño de textura máximo / mínimo en Android OpenGLES
  • Android 2D-juego, la mejor opción para los gráficos?
  • Añadir HTML / JS / CSS GUI a la aplicación OpenGL (Android e iOS)
  • OpenGLES en Android - IllegalStateException: setRenderer ya ha sido llamado para esta instancia
  • ¿Cuál es la diferencia entre los paquetes android.opengl y javax.microedition.khronos.opengles?
  • Android OpenGL textura de origen no local utilizando Rajawali3D?
  • Cuarzo 2D o OpenGL ES? Pros y contras a largo plazo, posibilidad de migración a otras plataformas
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.