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 ...
¿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 –
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. –
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 –