2010-03-23 32 views
6

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

Mi primera preocupación es determinar cuántos nombres de textura asignar y cómo puedo hacer esto de forma eficiente antes de renderizar mis vértices.

Mi segunda preocupación es cargar las texturas, tengo que inferir la textura que se cargará en función de los datos de mi juego. Esto significa que estaré jugando con cuerdas, lo cual entiendo es algo que realmente no debería estar haciendo en mi hilo GL.

En general Entiendo lo que sucede al cargar texturas, solo quiero obtener el mejor ciclo de vida. ¿Hay otras cosas que debería considerar?

Respuesta

14

1) Debe asignar tantos nombres de texturas como necesite. Uno para cada textura que estás usando.

Cargar una textura es una operación muy pesada que detiene la tubería de renderizado. Por lo tanto, nunca debes cargar texturas dentro de tu bucle de juego. Debería tener un estado de carga antes del estado de aplicación en el que representa las texturas. El estado de carga es responsable de cargar todas las texturas necesarias en el renderizado. Entonces, cuando necesite renderizar su geometría, tendrá todas las texturas cargadas y ya no tendrá que preocuparse por eso.

Tenga en cuenta que después de que ya no necesite las texturas, debe eliminarlas usando glDeleteTextures.

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

Por otro lado, si necesita pintar texto (como el puntaje actual), entonces las cosas se vuelven más complicadas en OpenGL. Tendrás las siguientes opciones: entrega el texto necesario a las texturas (fácil), implementa tu propio motor de fuentes de mapa de bits (más difícil) o usa un par de mapa de bits y Canvas para generar texturas sobre la marcha (lento).

Si tiene un conjunto limitado de mensajes que se mostrarán durante el juego, entonces probablemente los prefiera a texturas, ya que la implementación es bastante trivial.

Para el puntaje actual es suficiente tener una textura que tenga un glifo para números del 0 al 9 y usar eso para representar valores arbitrarios. La implementación será bastante sencilla.

Si necesita textos localizados más largos, entonces necesita comenzar a pensar en la generación de texturas sobre la marcha. Básicamente, crearía un mapa de bits en el que renderizaría texto utilizando un lienzo. Luego lo subirías como una textura y lo renderizarías como cualquier otra textura. Después de que ya no lo necesites, lo eliminarás. Esta opción es lenta y debe evitarse dentro del bucle de la aplicación.

3) En cuanto a las texturas y para obtener lo mejor de la GPU, debe tener al menos las siguientes cosas en mente (estas cosas serán un poco más avanzadas, y debe molestarse con ellas solo después de obtener la aplicación en funcionamiento y si necesita optimizar la velocidad de cuadros):

  • Minimice los cambios de textura ya que es una operación lenta. De manera óptima, debería representar todos los objetos con la misma textura en un lote. A continuación, cambie la textura y represente los objetos que lo necesiten y así sucesivamente.
  • Utilice atlas de textura para minimizar el número de texturas (y cambios de textura)
  • Si tiene muchas texturas, podría necesitar usar otras profundidades de bits que 8888 para que todas las texturas quepan en la memoria. Usar profundidades de bit más bajas también puede mejorar el rendimiento.
+2

Cuando dices "estado de carga", ¿está bien que sea al mismo tiempo que inicializo mi procesador? Mi pensamiento actual es hacer que inicialice mi gráfico de escena y consultar todos los objetos en el gráfico de escena para las texturas que terminarán solicitando (haciendo que infieran nombres del modelo del juego). Cada objeto que solicita una textura se proporcionará con el correspondiente "nombre" de OpenGL entero de las texturas que solicitó. ¿Esto parece sonido? –

+2

Me gusta modelar lógica de aplicaciones de alto nivel usando máquinas de estado. Por lo tanto, el término estado de carga. Está completamente bien hacer esto al mismo tiempo que hace el resto de la inicialización. Es solo una cuestión de cómo desea diseñar su lógica de aplicación. Parece sonido. – Lauri

2

Esto debería ser un comentario a la respuesta de Lauri, pero no puedo comentar con 1 representante, y hay una cosa que debe ser señaló:

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

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

del procesador. Obviamente, si tiene diferentes conjuntos de texturas para cargar en función (es decir) en el nivel de juego que está jugando, entonces cuando cambie de nivel, debe eliminar las texturas que no va a utilizar y cargar las nuevas texturas. Además, debe hacer un seguimiento de lo que debe volver a cargar cuando se pierde el contexto EGL.

Cuestiones relacionadas