2011-07-15 6 views
8

Estoy portando un juego de acción 2D desde Windows Phone 7 (desarrollado en XNA 4.0) a Android. Estoy usando un lote de Canvas.drawBitmap() llamadas - alrededor de 200-300 por actualización de fotograma - con diferentes pinturas para cada llamada para manejar la transparencia variable y la coloración en el tiempo de dibujo. Esto es gestionar los sistemas de partículas y varias otras superposiciones y efectos en el juego, así como un fondo de mosaico y sprites dentro del juego. No estoy haciendo ningún cambio de tamaño o rotación bajo demanda, son rectángulos sencillos de tamaño similar.Pobre rendimiento de Android Canvas.drawBitmap - cambiar a OpenGL?

En WP7 esto funciona a 30 + fps, pero estoy luchando para obtener 12 fps en el hardware de prueba de mi dispositivo (Samsung Galaxy S). Esto está haciendo el juego injugable. Después de haber perfilado el código, he confirmado que todo mi tiempo se está perdiendo en Canvas.drawBitmap()

Parece que estoy siguiendo todos los consejos de rendimiento habituales: uso de un SurfaceView, atento al GC, por lo que no creo cargas de material desechable objetos, y evitando Drawables.

¿Tengo razón en entender que Canvas.drawBitmap() está vinculado a la CPU, y si quiero mejorar el rendimiento tengo que cambiar a OpenGL que usará la GPU? No puedo encontrarlo sin decir nada en ninguna parte, pero leyendo entre líneas de algunos comentarios, creo que ese podría ser mi próximo paso ...

+1

¿Cómo dibuja sus bitmaps? ¿Qué formato de color? ¿Qué dimensiones? En la programación de gráficos, hay un montón * de cosas que respetar para que todo vaya rápido. Por favor publique un código –

+1

Gran pregunta. Tuve el mismo problema con Canvas.drawBitmap() y terminé portando el juego en openGl, pero tal vez me he perdido una opción súper secreta de Canvas. –

+0

El juego es de más de 100 clases, decenas de miles de líneas de largo. No estoy seguro de poder publicar un extracto razonable que sea particularmente informativo. Los Rectos varían de 16x6 a 128x128 en tamaño, todos ARGB_8888 –

Respuesta

7

Esto es normal. El lienzo es increíblemente lento cuando se usa transparencia (como ARGB_8888).

2 opciones:

  • Cambiar a OpenGL ES
  • Uso de la transparencia lo menos posible a los mapas de bits (es decir utilizar RGB_565 lo máximo que puede).
+0

Gracias. Solo quería confirmar esto antes de irme y aprender una pila de gráficos completamente nueva, en caso de que estuviera haciendo algo estúpido ... –

1

Quizás esto funcionará mejor en Android 3+ ya que utiliza aceleración de hardware para operaciones de lienzo.

Cuestiones relacionadas