OutOfMemory - Canvas

F

funcoder

Fortgeschrittenes Mitglied
39
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!
 
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()).
 
funcoder schrieb:
Hat jemand von euch schonmal das Problem gehabt, bzw. einen Lösungsvorschlag wie ich das Problem mit Canvas lösen kann?

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.
 
Versuche die erst zu skalieren, wenn du es wirklich brauchst und vorallem gib die bitmaps nach dem benutzen wieder frei (Bitmap.recycle()).
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
 

Ähnliche Themen

A
  • Arif12
Antworten
7
Aufrufe
1.409
Jaiel
Jaiel
H
Antworten
3
Aufrufe
1.176
swa00
swa00
znieh99
Antworten
2
Aufrufe
780
znieh99
znieh99
Zurück
Oben Unten