Android VM Ermöglicht keine Zuweisung von xx Bytes

8

Ich arbeite an einem Android-Spiel. Problem beginnt, wenn ich versuche, 3 Bilder für den Hintergrund zu verwenden. Bilder sind 1280x720px und 100kb groß. Die Bilder sind wirklich nicht so groß, also bin ich etwas verwirrt, warum sie Speicherprobleme verursachen sollten.

Hinweis: Die Bildschirmauflösung beträgt 800 x 400, daher kann das Bild nicht wirklich um den Faktor 2 verkleinert werden, da es vorgeschlagen wird auf Android-Entwickler Hinweis: Ich benutze HTC Wunsch-Telefon (hier Absturz kommt), ich habe es auch auf Samsung Galaxy S1 versucht und auf Samsung funktioniert es OK.

Ich habe das Gedächtnis in DDMS analysiert und was seltsam ist, ist, dass Heap nur 3,5 MB groß ist. Wenn ich rt.MaxMemory () überprüfe, heißt das, dass ich ungefähr 25 MB Speicherplatz pro App habe.

Was mir in den Sinn kommt, ist, dass der Heap nicht schnell genug aktualisiert wird, um größere Fotos / Apps aufzunehmen, also stürzt er ab, bevor er Bilder laden kann, obwohl er so klein ist. Gibt es eine Möglichkeit, die Heap-Größe manuell festzulegen oder zumindest zu vergrößern?

Hier ist Code, wo ich Bilder lade:

%Vor%

Hier ist ein genauer Fehler von LogCat:

%Vor%

BEARBEITEN: Nun, da Sie gesagt haben, dass es sinnvoll ist, dass Bitmaps "rohe" Bildgröße verwenden und nicht komprimiert. Und nach einigen Recherchen scheint es, dass auf Android 2.2 und 2.3 Bitmaps nicht im Heap gespeichert werden, deshalb erhöht sich der Heap nicht, nachdem das Image geladen wurde.

Ich habe noch eine Frage. Wir verwenden diese 3 Bilder für den Hintergrund. Wir werden sie jetzt ein wenig in vertikaler Richtung verändern, aber in horizontaler Richtung brauchen wir sie immer noch wie sie sind. Das Bild wird also immer noch etwa 100x720px groß sein. Das Problem, warum wir 3 Bilder brauchen, ist, so dass wir sie separat zeichnen und Ebeneneffekte erzielen können (wir können etwas zwischen 2 Bildern zeichnen). Was wäre der beste Weg, dies zu implementieren, um den gewünschten Effekt mit möglichst wenig Speicher zu erzielen?

Hintergrund: Mitte: Vordergrund

Hinweis: Dies sind nur statische Hintergründe, Animation läuft um und zwischen ihnen.

    
Jani 27.10.2012, 11:42
quelle

1 Antwort

4

Ich bin mir nicht sicher, wo Sie eine 1280 x 720 Pixelbitmap mit 100 KB erhalten. Es sind wirklich mehrere Megabyte. In Bytes sind es 1280 * 720 * jedoch viele Bytes pro Pixel, normalerweise 4 für Bilder mit Transparenz oder 2 für Bilder ohne. Es ist eine riesige Menge an Daten für ein Handy zu laden. Vielleicht zitieren Sie die Größe einer komprimierten Bildformatversion wie PNG.

Einige Tipps zum Umgang mit Speicherproblemen:

Verwenden Sie das Bitmap.Config.RGB_565-Eingabeformat in Ihrer Factory, wenn Sie keine Transparenz haben. Dies spart Platz gegenüber ARGB_8888.

Setzen Sie largeHeap im Anwendungselement in Ihrer AndroidManifest.xml auf true.

Stellen Sie sicher, dass Ihre Bitmaps nicht automatisch basierend auf der Dichteklasse der Geräte skaliert werden. Platzieren Sie sie beispielsweise in drawable-nodpi oder deaktivieren Sie die automatische Skalierung programmatisch oder stellen Sie für jede Dichteklasse in mehreren ziehbaren Ordnern ein anderes Bitmap bereit. Wenn sich Ihre Bitmap nur im Zeichnungsordner befindet, wird sie auf XHDPI-Geräten 2x skaliert.

Bereiten Sie Bitmaps auf, die Sie nicht verwenden, z. B .:

%Vor%

Sie können System.gc () auch manuell ausführen. Das System sollte das für Sie tun, bevor Sie einen OutOfMemoryError zurückgeben, aber nicht mit Bitmaps in Android, weil sie Speicher außerhalb von Java zugewiesen haben.

Beachten Sie, dass Sie beim Einlesen einer Bitmap tatsächlich prüfen können, ob die benötigte Größe ein ganzzahliger Divisor ist, der kleiner als seine Größe ist, und geben Sie an, dass die Factory beim Laden Pixel überspringen soll. Dies kann bei Geräten mit kleinerer Auflösung helfen, die entsprechend kleinere Speichergrenzen haben.

Wenn Sie diese Hintergrundbilder nicht separat verschieben, zeichnen Sie sie alle auf eine einzelne Bitmap und verwenden Sie diese anstelle von drei auf einmal.

    
Lance Nanek 27.10.2012, 23:35
quelle

Tags und Links