Schlechte Leistung von Android Canvas.drawBitmap - Wechsel zu OpenGL?

8

Ich portiere ein 2D Action-Spiel von Windows Phone 7 (in XNA 4.0 entwickelt) auf Android. Ich verwende eine Menge von Canvas.drawBitmap () -Aufrufen - etwa 200-300 pro Frame-Aktualisierung - mit verschiedenen Farben für jeden Aufruf, um unterschiedliche Transparenz und Farbgebung beim Zeichnen zu handhaben -Zeit. Dies beinhaltet das Verwalten von Partikelsystemen und verschiedenen anderen Overlays und In-Game-Effekten sowie einen gekachelten Hintergrund und In-Game-Sprites. Ich mache keine On-Demand-Größenänderung oder rotierende, es ist einfach src- & gt; dest Rechtecke der gleichen Größe.

Auf WP7 läuft das mit 30 + fps, aber ich kämpfe um 12fps auf meiner Test Droid Hardware (Samsung Galaxy S). Dies macht das Spiel unspielbar. Nach dem Profilieren des Codes habe ich bestätigt, dass meine gesamte Zeit in Canvas.drawBitmap () verloren geht

Ich glaube, ich befolge alle üblichen Leistungsempfehlungen - benutze ein SurfaceView, achte auf GC und erschaffe möglichst viele wegwerfbare Objekte und vermeide Drawables.

Habe ich richtig verstanden, dass Canvas.drawBitmap () CPU-gebunden ist, und wenn ich die Leistung verbessern möchte, muss ich zu OpenGL wechseln, das die GPU verwendet? Ich kann nicht finden, dass es überall unverhüllt ist, aber zwischen den Zeilen einiger Kommentare zu lesen, denke ich, dass das vielleicht mein nächster Schritt sein müsste ...?

    
Paul Harman 15.07.2011, 10:03
quelle

2 Antworten

7

Das ist normal. Canvas ist erstaunlich langsam bei Verwendung von Transparenz (wie ARGB_8888 ).

2 Optionen:

  • Wechseln Sie zu OpenGL ES
  • Verwenden Sie so wenig Transparenz wie möglich auf Ihren Bitmaps (verwenden Sie RGB_565 so gut wie möglich).
user703016 15.07.2011, 10:39
quelle
1

Vielleicht wird dies unter Android 3+ besser laufen, da die Hardwarebeschleunigung für Canvas-Vorgänge verwendet wird.

    
RobotRock 29.11.2011 19:19
quelle