2010-12-01 23 views
5

He hecho mi perfil y parece que la mayor parte de mi tiempo lo paso en drawBitmap, que se llama (comprensiblemente) en cada fotograma.Cómo optimizar el dibujo de Lienzo - drawBitmap en Android?

Uso el enfoque SurfaceView/actualización de hilo/bloqueo de lona como se demostró en la muestra de LunarLander. Pero he cambiado que (según this question) como a

  • en el primer cuadro construir un buffer de mapa de bits y pintar sobre ella
  • pintar cada cuadro subsiguiente reutilización de ese mapa de bits (no todo en mis cambios de pantalla)
  • al final de cada marco de la pintura de la memoria intermedia una vez en el lienzo de destino (en la pantalla)

Traceview me mostró que este drawBitmap toma 5 ms para cada cuadro en mi dispositivo de 800x480. ¿Puedo obtener algo mejor que eso o es solo algo que está 'tallado en la piedra' y solo tengo que optimizar otras partes del código para lograr buenos cuadros por segundo?

+0

puede realizar un seguimiento del rectángulo sucio cada cuadro y sólo actualizar eso? Obviamente, eso no te ayudará mucho si cambias un poco en la esquina superior izquierda e inferior derecha. – EboMike

+0

OpenGL probablemente sea una mejor opción para usted. He realizado muchas pruebas en teléfonos y tabletas y drawBitmap() es demasiado lento, principalmente en tabletas. Sin embargo, estas son algunas opciones para usted: http://www.independent-software.com/android-speeding-up-canvas-drawbitmap/ –

Respuesta

10

Depende de muchas cosas, pero normalmente drawBitmap() será lo más rápido posible. En su caso particular, si no necesita fusión, asegúrese de que esté usando un mapa de bits opaco. Además, intente usar un mapa de bits en un formato compatible con su Surface. Por ejemplo, si está utilizando una superficie de 16 bits, dibujar un mapa de bits de 16 bits (RGB565) será muy rápido (es solo una llamada memcpy). Si su Surface tiene 32 bits, use un mapa de bits opaco ARGB8888.

+3

¿Cómo recomienda detectar el formato de la superficie? El valor de "formato" transferido a surfaceChanged parece ser siempre "-1". –

+0

@dpk En lugar de detectar, puede configurarlo usted mismo con setFormat() http://developer.android.com/reference/android/view/SurfaceHolder.html#setFormat%28int%29 – Aron

Cuestiones relacionadas