2012-11-10 16 views
11

Folks Laden, weiß ich nicht denken, dass dies ein Duplikat ist und nicht einer von denen, wie ich Ooms Fragen zu vermeiden tun. Dies ist eine echte Suche nach Wissen, also halten Sie auf die unten Stimmen bitte ...Warum Android mehr Speicher als benötigt zuteilen, wenn Bilder

Stellen Sie sich vor, ich habe eine JPEG von 500x500 Pixel. Ich lade es als ARGB_8888, die als "bad as it gets" ist.

Ich würde Android erwarten 500x500x4 bytes = a little under 1MB jedoch zuzuteilen, Blick auf einen Heapdump und Sie werden sehen, dass Android deutlich mehr, oft Faktoren 5-10 mal größer zuordnet.

Sie häufig gestellte Fragen finden Sie hier über OOMS wo der Stack-Trace eine heap request of say 15MB zeigt, und es ist immer viel größer als nur erforderlich ist, um die Bytes des Bildes zu halten. Das OP fängt normalerweise einige Downvotes auf und wird dann mit Aktienantworten und Kommentaren über die Verwendung von weniger Speicher (danke Romain!) Und Skalierung bombardiert. Ich denke, es gibt mehr, als hier auffällt.

Jeder weiß, warum das ist? Wenn es keine offensichtliche Antwort gibt, werde ich einen SSCCE zusammensetzen, wenn es hilft.

PS. Ich nehme an, dass JPEG vs PNG usw. irrelevant ist, da wir über die Speichernutzung der Backing-Bitmap sprechen, die einfach x mal y BPP ist - oder bin ich langsam?

+4

Sind Sie sicher, dass das Bild nicht durch seine Anwendung skaliert wird (z. B. durch Laden in ein ImageView, das nicht die gleichen Abmessungen hat)? Darüber hinaus sollten Sie, wenn Sie sich Ihren Heap Dump ansehen, genau sehen, wo die "Faktoren 5-10 mal größer" zugewiesen wurden - wo haben Sie diese Werte gesehen? "Ich werde ein SSCCE zusammenstellen, wenn es hilft" - bitte tun. – CommonsWare

+0

Ah. Sieht so aus, als wäre ich langsam. Lassen Sie mich ein Beispiel versuchen und kommen Sie zurück, wenn und wenn ich finde, dass es nicht skaliert wird, wenn es angewendet wird. Danke – Simon

+0

Seltsamerweise will der Typ in [dieser Frage] (http://stackoverflow.com/questions/4866653/read-in-jpg-as-rgb888-on-android) * * und ARGB8888, bekommt aber immer einen RGB565 . Vielleicht kannst du seine Methode benutzen? – GolezTrol

Antwort

1

Es war ein ziemlich üblicher Trick mit Speicherverwaltung, um einen Pool oder einen Speicherblock zu erhalten, der in kleinere Anfragen aufgeteilt wird. Bei der Arbeit mit eingebetteten Systemen war es üblich, Speicherpools unterschiedlicher Größe zu verwalten, und wir haben einfach einen Block zugewiesen, der größer war als die angeforderte Menge aus einem Pool. Dies ist ein praktischer Weg, um zu viel Speicherfragmentierung zu verhindern. Vielleicht passiert das hier.

Verwandte Themen