Cargando texturas en una aplicación de Android OpenGL ES

Me preguntaba si alguien podría aconsejar sobre un buen patrón para cargar texturas en una aplicación Android Java y OpenGL ES.

Mi primera preocupación es determinar cuántos nombres de texturas asignar y cómo puedo hacerlo eficientemente haciendo esto antes de representar mis vértices.

Mi segunda preocupación es en la carga de las texturas, tengo que inferir la textura para ser cargado sobre la base de mis datos de juego. Esto significa que estaré jugando con cuerdas, que entiendo es algo que realmente no debería estar haciendo en mi hilo GL.

En general, entiendo lo que está pasando al cargar texturas, sólo quiero obtener el mejor ciclo de vida de la misma. ¿Hay otras cosas que debo considerar?

1) Debe asignar tantos nombres de textura como necesite. Uno para cada textura que usted está utilizando.

Cargar una textura es una operación muy pesada que bloquea la canalización de renderizado. Por lo tanto, nunca debe cargar las texturas dentro de su bucle de juego. Debe tener un estado de carga antes del estado de la aplicación en el que procesa las texturas. El estado de carga es responsable de cargar todas las texturas necesarias en la representación. Así que cuando necesites renderizar tu geometría, tendrás todas las texturas cargadas y ya no tendrás que preocuparte por eso.

Tenga en cuenta que después de que no necesita las texturas más, tiene que eliminarlos con glDeleteTextures.

2) Si quiere decir inferir que necesita diferentes texturas para diferentes niveles o algo similar, debe procesar los datos de nivel en el estado de carga y decidir qué texturas deben cargarse.

Por otro lado, si usted necesita para pintar el texto (como la puntuación actual), entonces las cosas se complican más en OpenGL. Tendrá las siguientes opciones: prerender el texto necesario a las texturas (fácil), implementar su propio motor de fuente de mapa de bits (más difícil) o utilizar Bitmap y par Canvas para generar texturas sobre la marcha (lento).

Si tiene un conjunto limitado de mensajes que se mostrarán durante el juego, entonces lo más probable es prerender a texturas como la aplicación es bastante trivial.

Para la puntuación actual es suficiente tener una textura que tenga un glifo para números de 0 a 9 y usarlo para representar valores arbitrarios. La implementación será bastante sencilla.

Si necesita textos localizados más largos entonces usted necesita comenzar a pensar en la generación de texturas sobre la marcha. Básicamente, se crearía un mapa de bits en el que se renderiza el texto utilizando un lienzo. Entonces usted lo cargaría como textura y lo rendiría como cualquier otra textura. Después de que no lo necesite más, entonces lo borra. Esta opción es lenta y debe evitarse dentro del bucle de aplicación.

3) Con respecto a las texturas y para obtener lo mejor de la GPU, debe mantener por lo menos las siguientes cosas en su mente (estas cosas se pondrán un poco más avanzadas, y usted debe molestarse con ellos sólo después de obtener la aplicación en funcionamiento y Si necesita optimizar la velocidad de fotogramas):

  • Minimice los cambios de textura ya que es una operación lenta. De manera óptima debe renderizar todos los objetos utilizando la misma textura en un lote. A continuación, cambiar la textura y hacer que los objetos que necesitan eso y así sucesivamente.
  • Utilice atlas de textura para minimizar el número de texturas (y cambios de textura)
  • Si tienes muchas texturas, podrías necesitar usar otras profundidades de bits que 8888 para hacer que todas tus texturas encajen en la memoria. El uso de profundidades de bits más bajas también puede mejorar el rendimiento.

Este debe ser un comentario a la respuesta de Lauri, pero no puedo comentar con 1 representante, y hay algo que debe señalarse:

Debe volver a cargar texturas cada vez que su contexto EGL se pierde (es decir, cuando sus aplicaciones se pone a fondo y viceversa). Por lo tanto, la ubicación correcta para (re) cargarlos está en el método

public void onSurfaceChanged(GL10 gl, int width, int height) 

Del procesador. Obviamente, si tienes diferentes conjuntos de texturas para ser cargados en base (es decir) en el nivel de juego que estás jugando, entonces cuando cambias de nivel deberías eliminar las texturas que no vas a usar y cargar las nuevas texturas. Además, debe realizar un seguimiento de lo que tiene que volver a cargar cuando se pierde el contexto EGL.

  • Texturas que sólo se muestran en algunos dispositivos
  • Compartir el contexto GLES20 y texturas entre GLSurfaceViews diferentes?
  • ¿Para qué se utiliza Android TextUtils?
  • Textura de texturepacker en LibGDX
  • libgdx spritebatch no dibuja basado en el origen de una textura
  • Carga rápida de texturas en OpenGL 2.0
  • Tamaño de textura mínimo requerido para el cumplimiento con OpenGL-ES 2.0 en Android?
  • ¿Puede OpenGL ES renderizar texturas de dimensiones no básicas 2?
  • Android NDK OpenGL ES 2.0 Tono de textura
  • Texturas OpenGL de Android: crearlas y borrarlas al vuelo
  • ¿Textura al revés? | OpenGL-ES 2.0 (Android)
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.