1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

OutOfMemory - Canvas

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von funcoder, 06.12.2010.

  1. funcoder, 06.12.2010 #1
    funcoder

    funcoder Threadstarter Erfahrener Benutzer

    Beiträge:
    218
    Erhaltene Danke:
    38
    Registriert seit:
    15.08.2009
    Hallo Zusammen,
    ich benötige für mein game mehrere größere PNG dateien mit Alpha Kanal. Die komprimierte PNG ist gut 143 kb groß. Bei Geräten mit einer hohen Pixeldichte lasse ich direkt beim laden der Bitmaps die Grafiken entsprechend hochskalieren.
    Mein Problem ist, dass ich anscheinend den Heap Space der VM überschreite.
    Was ich nicht verstehe ist, warum versucht wird 3,08 MB Speicher zu reservieren, wobei die Datei ja selbst nur 143 KB groß ist!
    Oder deute ich die Exception falsch:
    VM won't let us allocate 3080000 bytes
    java.lang.OutOfMemoryError: bitmap size exceeds VM budget

    Werden alle Grafiken unkomprimiert in den Speicher abgelegt?

    Hat jemand von euch schonmal das Problem gehabt, bzw. einen Lösungsvorschlag wie ich das Problem mit Canvas lösen kann?

    Meine Bitmaps lade ich wie folgt:
    Code:
    bitmapConfig = new BitmapFactory.Options();
    if(dpi == 120){
    	bitmapConfig.inScaled = false;
    }else if (dpi > 160){
    	bitmapConfig.inScaled = true;
    }					
    
    Bitmap grafik = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.grafik,bitmapConfig);
    
    Vielen Dank für jeden Hinweis oder Rat!
     
  2. Unicate, 06.12.2010 #2
    Unicate

    Unicate Android-Experte

    Beiträge:
    473
    Erhaltene Danke:
    57
    Registriert seit:
    09.08.2010
    Hi erstma!

    Ich bin überzeugt davon, das der die Bitmaps im Speicher tatsächlich als Bitmaps speichert (pixel für pixel) und wenn du die vorher noch hochskaliert hast, dann trägt das nicht zur Performance bei.

    Versuche die erst zu skalieren, wenn du es wirklich brauchst und vorallem gib die bitmaps nach dem benutzen wieder frei (Bitmap.recycle()).
     
  3. miha, 07.12.2010 #3
    miha

    miha Fortgeschrittenes Mitglied

    Beiträge:
    294
    Erhaltene Danke:
    43
    Registriert seit:
    12.01.2010
    Hatte das Problem auch. Hab das Bild aufgeteilt in mehrere kleine aus denen ich dann zusammenpuzzle. Weiß aber nicht ob das bei dir geht falls du das ganze Bild wirklich in groß brauchst - denn er wird das Bild ja nicht als PNG im Bitmap/Canvas speichern sondern unkomprimiert zum Anzeigen. Bleibt dir sonst vielleicht noch die Bildqualität in der Bitmapconfig zu reduzieren auf z.B. 565 oder 4444.
     
  4. funcoder, 08.12.2010 #4
    funcoder

    funcoder Threadstarter Erfahrener Benutzer

    Beiträge:
    218
    Erhaltene Danke:
    38
    Registriert seit:
    15.08.2009
    Danke, gute Idee! Ich baue jetzt mal meinen Renderprozess ein wenig um, ich hoffe nur das wenn ich die Bitmap X zur Laufzeit um den Faktor 1.5 skalier, dass es für diesen kurzen Zeitraum nicht den gesamten RAM beansprucht.

    Aber sehe ich das richtig das es eigentlich egal ist, wenn ich eine JPG oder eine PNG ohne Alpha Kanal ablegen, dass beide Files gleich viel RAM bzw. den Heap Space gleich beanspruchen?

    Mein Emulator mit der WVGA Auflösung bekommt standardmäßig 24MB Heap Space. Beträgt der Heap Space, bei allen WVGA Geräten auch "nur" 24MB? Weiß das jemand?

    Danke
     

Diese Seite empfehlen