Pregunta

Estoy trabajando en un juego de desplazamiento 2D para iPhone. Tengo un fondo de imagen grande, digamos 480 & # 215; 6000 píxeles, de solo una parte es visible (exactamente una pantalla, 480 & # 215; 320 píxeles). ¿Cuál es la mejor manera de obtener dicho fondo en la pantalla?

Actualmente tengo el fondo dividido en varias texturas (para sortear el límite máximo de tamaño de la textura) y dibujar todo el fondo en cada cuadro como una tira de triángulo texturado. El desplazamiento se realiza traduciendo la matriz de Modelview. La caja de tijera está configurada para el tamaño de la ventana, 480 & # 215; 320 píxeles. Esto no pretende ser rápido, solo quería un código de trabajo antes de poder optimizar.

Pensé que tal vez la implementación de OpenGL sería lo suficientemente inteligente como para descartar la parte invisible del fondo, pero de acuerdo con algún código de medición que escribí, parece que el fondo necesita 7 & nbsp; ms para dibujar en promedio y 84 & nbsp; ms como máximo. (Esto se mide en el simulador). Esto es aproximadamente la mitad de todo el bucle de procesamiento, es decir. bastante lento para mi

Dibujar el fondo debe ser tan fácil como copiar unos 480 & # 215; 320 píxeles de una parte de la VRAM a otra, o, en otras palabras, muy rápido. ¿Cuál es la mejor manera de acercarse a este rendimiento?

¿Fue útil?

Solución

Esa es la forma rápida de hacerlo. Cosas que puedes hacer para mejorar el rendimiento:

  • Prueba diferentes formatos de textura. Presumiblemente, los documentos del SDK tienen detalles sobre el formato preferido, y presumiblemente, más pequeño es mejor.
  • Elimina por completo los mosaicos fuera de la pantalla
  • Dividir la imagen en texturas más pequeñas

Supongo que estás dibujando a un nivel de zoom de 1: 1; ¿Es ese el caso?

Editar: ¡Vaya! Después de haber leído tu pregunta con más cuidado, tengo que ofrecerte otro consejo: Los tiempos hechos en el simulador no tienen ningún valor.

Otros consejos

La solución rápida:

  • Cree una matriz de geometría de mosaicos (preferiblemente quads) para que haya al menos una fila / columna de mosaicos fuera de pantalla en todos los lados del área visible.

  • Asigna texturas a todos esos mosaicos.

  • Tan pronto como una ficha esté fuera del área visible, puede liberar esta textura y enlazar una nueva.

  • Mueva los azulejos usando un módulo del ancho y la altura del azulejo como posición (de modo que el azulejo se vuelva a colocar en su posición inicial cuando haya movido exactamente un azulejo de largo). También recuerde volver a asignar las texturas durante esa operación. Esto le permite tener una cuadrícula muy pequeña / muy poca memoria de textura cargada en un momento dado. Lo que creo que es especialmente importante en GL ES.

Si tiene memoria de sobra y todavía está plagado de una velocidad de carga lenta (aunque no debería hacerlo por esa cantidad de texturas). Podría crear un motor de transmisión de texturas que precargue texturas en una memoria más rápida (lo que sea que esté en su dispositivo de destino) cuando llegue a un área nueva. El mapeo como texturas en ese caso irá de esa memoria más rápida cuando sea necesario. Solo asegúrate de poder cargarlo sin utilizar toda la memoria y recuerda liberarlo dinámicamente cuando no sea necesario.

Aquí hay un enlace a un motor de mosaico GL (no ES). No lo he usado yo mismo, así que no puedo responder por su funcionalidad, pero podría ayudarte: http://www.mesa3d.org/brianp/TR.html

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top