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.
- Matrices OpenGL - no pueden figurar las correctas
- Visualización de texto de desplazamiento en forma de carpintería en Android
- Necesidad de calcular el vector de rotación a partir de los datos de Sensor.TYPE_ORIENTATION
- Bucle de juego android vs actualización en el hilo de renderizado
- Resultados inesperados implementando desenfoque de movimiento simple en Libgdx
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?
- Intercambiar píxeles de MainTex con otras texturas a través de la superficie Shader (Unity)
- Zoom in OpenGL ES 2.0 - desapareciendo objeto
- ¿Qué hace gl.glClearColor?
- Problemas para que SurfaceTexture funcione con Android Videoplayer en MALI 400
- Android OpenGL Renderizar a un frameBuffer en la resolución original (pequeña) y luego escalarla (viewPort) al tamaño de la pantalla
- Vista previa de la cámara más rápida con OpenGL?
- Error: glBufferData usando Cordova
- Cómo hacer una cámara personalizada con Live Stickers
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/
- Administrador de Ubicaciones ProxmityAlert siempre dice entrar
- GetHostAddress () devuelve una dirección IP invertida