2010-12-01 17 views
5

Ich habe mein Profiling gemacht und es scheint, dass die meiste Zeit in drawBitmap verbracht wird, die (verständlicherweise) auf jedem Frame aufgerufen wird.So optimieren Sie Canvas-Zeichnung - DrawBitmap auf Android?

Ich benutze SurfaceView/Aktualisierung Thread/Leinwand Verriegelung Ansatz wie in LunarLander Probe gezeigt. Aber ich habe mich verändert es (nach this question) in Bezug auf

  • auf dem ersten Frame konstruieren einen Puffer Bitmap und malen auf sie
  • jeden nachfolgenden Rahmen malen Wiederverwendung dass Bitmap (nicht alles auf meinem Bildschirm ändert)
  • am Ende jedes Rahmens malen den Puffer einmal in das Ziel-Leinwand (auf dem Bildschirm)

Traceview hat mir gezeigt, dass diese DrawBitmap 5ms für jeden Frame auf meinem 800x480 Gerät nimmt. Kann ich besser werden oder ist es nur etwas, das in den Stein gemeißelt wird, und ich muss nur andere Teile des Codes optimieren, um gute Bilder pro Sekunde zu erzielen?

+0

Können Sie jeden Frame Spur des schmutzigen Rechteck halten und nur das aktualisieren? Offensichtlich hilft dir das nicht viel, wenn du ein wenig oben links und unten rechts wechselst. – EboMike

+0

OpenGL wird wahrscheinlich eine bessere Wahl für Sie sein. Ich habe viele Tests auf Handys und Tablets durchgeführt und drawBitmap() ist einfach zu langsam, hauptsächlich auf Tablets. Hier sind jedoch einige Optionen für Sie: http://www.independent-software.com/android-speeding-up-canvas-drawbitmap/ –

Antwort

10

Es hängt von vielen Dingen ab, aber normalerweise wird drawBitmap() so schnell wie möglich sein. Stellen Sie in einem bestimmten Fall sicher, dass Sie eine undurchsichtige Bitmap verwenden, wenn Sie keine Überblendung benötigen. Versuchen Sie außerdem, eine Bitmap in einem Format zu verwenden, das mit Ihrer Oberfläche kompatibel ist. Wenn Sie beispielsweise eine 16-Bit-Fläche verwenden, ist das Zeichnen einer 16-Bit-Bitmap (RGB565) sehr schnell (es handelt sich lediglich um einen Memcpy-Aufruf). Verwenden Sie eine undurchlässige ARGB8888-Bitmap, wenn Ihre Fläche 32 Bit beträgt.

+3

Wie empfehlen Sie, das Format der Oberfläche zu erkennen? Der Wert von "format", der an "surfaceChanged" übergeben wird, scheint immer "-1" zu sein. –

+0

@ dpk Anstatt zu erkennen, können Sie es selbst setzen mit setFormat() http://developer.android.com/reference/android/view/SurfaceHolder.html#setFormat%28int%29 – Aron

Verwandte Themen