Pregunta

Estoy desarrollando un juego 2D para iPhone con OpenGL ES y me gustaría usar una imagen de mapa de bits de 320x480 como fondo persistente.

Mi primer pensamiento fue crear un cuadrante de 320x480 y luego asignar una textura en él que represente el fondo. Entonces ... creé una textura de 512x512 con una imagen de 320x480 en ella. Luego asigné eso al 320x480 quad.

Dibujé este fondo en cada fotograma y luego dibujé sprites animados sobre él. Esto funciona bien, excepto que el dibujo de todos estos objetos (fondo + sprites) es demasiado lento.

Hice algunas pruebas y descubrí que mi desaceleración está en la línea de píxeles. No en vano, la gran imagen de fondo es el principal culpable. Para probar esto, eliminé el dibujo de fondo y todo lo demás se procesó muy rápido.

Estoy buscando consejos sobre cómo mantener mi historial y también mejorar el rendimiento.

Aquí hay más información:

1) Actualmente estoy probando en el simulador (todavía estoy esperando la licencia de Apple)

2) El fondo es una textura PVR comprimida hasta 128k

3) Esperaba que hubiera una manera de almacenar este fondo en un búfer de color, pero no tuve suerte con eso. eso puede deberse a mi inexperiencia con OpenGL ES o podría ser una idea estúpida que no funcionará :)

4) Me doy cuenta de que no siempre es necesario actualizar todo el fondo, solo las partes que han sido dibujadas por los sprites en movimiento. Comencé a buscar técnicas para actualizar (según sea necesario) partes del fondo como texturas separadas o con una caja de tijeras, sin embargo, esto parece menos elegante.

Cualquier consejo / consejo sería muy apreciado ...

Gracias.

¿Fue útil?

Solución 3

Gracias a todos los que proporcionaron información sobre esto. Todos los consejos ayudaron de una manera u otra.

Sin embargo, quería dejar claro que el problema principal aquí resultó ser el comportamiento del simulador en sí (como lo indica Andreas en su respuesta). Una vez que pude obtener la aplicación en el dispositivo, funcionó mucho, mucho mejor. Menciono esto porque, antes de desarrollar mi juego, había visto muchas publicaciones que indicaban que el dispositivo era mucho más lento que el simulador. Esto puede ser cierto en algunos casos (por ejemplo, lógica de aplicación general), pero en mi experiencia, la animación (particularmente las transformaciones 3D) es mucho más rápida en el dispositivo.

Otros consejos

  1. No haga pruebas de rendimiento en el simulador. Siempre!
    Las diferencias con el hardware real son enormes. En ambas direcciones.
  2. Si dibuja el fondo en cada cuadro:
    No borre el framebuffer. El fondo sobregirará todo de todos modos.
  3. ¿Realmente necesitas una textura de fondo?
    ¿Qué pasa con el uso de un degradado de color a través de colores de vértice?
  4. Intente usar el modo 2bit para la textura.
  5. Desactive todos los pasos de procesamiento que no necesite para el fondo.
    Por ejemplo: iluminación, mezcla, prueba de profundidad, ...

Si pudieras publicar algunos de tus códigos de dibujo, sería mucho más fácil ayudarte.

Si estás haciendo un juego en 2D, ¿hay alguna razón por la que no estés usando una biblioteca existente? Específicamente, el cocos2d para iPhone puede valer su tiempo. No puedo responder a tu pregunta sobre cómo solucionar el problema haciéndolo todo por ti mismo, pero puedo decir que he hecho exactamente lo que estás diciendo (tener un fondo de pantalla completa con sprites en la parte superior) con cocos2d y funciona genial. (Asumir que 60 fps es lo suficientemente rápido para usted). Puede tener sus razones para hacerlo usted mismo, pero si puede, le sugeriría al menos hacer un prototipo rápido con cocos2d y ver si eso no le ayuda. (Los detalles y la fuente de la versión para iPhone están aquí: http://code.google.com/ p / cocos2d-iphone / )

No tengo mucha experiencia con OpenGL ES, pero este problema ocurre generalmente.

Su idea sobre el 'búfer de color' es una buena intuición, básicamente, desea almacenar su fondo como un búfer de cuadros y cargarlo directamente en su búfer de representación antes de dibujar el primer plano.

En OpenGL esto es bastante sencillo con los objetos Frame Buffer (FBO). Desafortunadamente, no creo que OpenGL ES los admita, pero podría darte un lugar para comenzar a buscar.

es posible que desee probar el uso de VBO (objetos de búfer de vértice) y ver si eso acelera las cosas. El tutorial es aquí

Además, acabo de ver que desde OpenGL ES v1.1 , hay es una función llamada glDrawTex (Draw Texture) diseñada para

  

representación rápida de pinturas de fondo, glifos de fuente de mapa de bits y elementos de encuadre 2D en juegos

  1. Podría usar objetos de búfer de cuadro similares al ejemplo de GLPaint de Apple.
  2. Usa un atlas de textura para minimizar el número de llamadas de sorteo que haces. Puede usar glTexCoordPointer para configurar sus coordenadas de textura que mapean cada imagen a su posición correcta. Recuerde configurar su búfer de vértice también. Lo ideal es que una sola llamada dibuje tu escena 2D completa.
  3. Evite habilitar / deshabilitar estados cuando sea posible.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top