2010-12-01 12 views
5

J'ai fait mon profilage et il semble que la plupart de mon temps est passé pendant drawBitmap, qui est appelé (de manière compréhensive) sur chaque trame.Comment optimiser le dessin de toile - drawBitmap sur Android?

J'utilise l'approche de verrouillage de thread/canvas de SurfaceView/mise à jour comme démontré dans l'exemple LunarLander. Mais je l'ai changé (selon this question) à

  • sur la première image construire un tampon bitmap et de la peinture sur elle
  • peindre chaque image ultérieure réutilisation que Bitmap (pas tout sur l'écran change)
  • à la fin de chaque trame peindre le tampon une fois dans le canevas cible (à l'écran)

TraceView me a montré que cette DrawBitmap prend 5ms pour chaque trame sur le terminal de 800x480. Puis-je obtenir mieux que cela ou est-ce juste quelque chose qui est «gravé dans la pierre» et je dois juste optimiser d'autres parties du code pour obtenir de bonnes images par seconde?

+0

Pouvez-vous garder une trace du rectangle sale chaque image et ne mettre à jour que? Évidemment, cela ne vous aidera pas beaucoup si vous changez un petit peu dans le coin en haut à gauche et en bas à droite. – EboMike

+0

OpenGL sera probablement un meilleur choix pour vous. J'ai effectué de nombreux tests sur les téléphones et les tablettes et drawBitmap() est trop lent, principalement sur les tablettes. Cependant, voici quelques options pour vous: http://www.independent-software.com/android-speeding-up-canvas-drawbitmap/ –

Répondre

10

Cela dépend de beaucoup de choses, mais habituellement drawBitmap() sera aussi rapide que possible. Dans votre cas particulier, si vous n'avez pas besoin de fondre, assurez-vous que vous utilisez un bitmap opaque. En outre, essayez d'utiliser un bitmap dans un format compatible avec votre surface. Par exemple, si vous utilisez une surface 16 bits, dessiner un bitmap 16 bits (RGB565) sera très rapide (c'est juste un appel memcpy). Si votre surface est de 32 bits, utilisez un bitmap opaque ARGB8888.

+3

Comment recommandez-vous de détecter le format de la Surface? La valeur "format" transmise à surfaceChanged semble toujours être "-1". –

+0

@dpk Plutôt que de détecter vous pouvez le définir vous-même avec setFormat() http://developer.android.com/reference/android/view/SurfaceHolder.html#setFormat%28int%29 – Aron