Frage

Ich mache ein Spiel, das zu Beginn alle Bitmaps laden muss, da im eingebauten Spieleditor der Benutzer eine der Sprites in das Level bringen kann. Ebenen verwenden auch verschiedene Sprites ohne System, mit denen Gruppen von Sprites für jeden Level dynamisch belastet werden können.

Nach einer Weile sind die jetzt bereits über 250 PNG -Bilder im Spiel mit einer Gesamtgröße von 3,5 MB.

Das Spiel lädt die meisten Sprites (ca. 200) mit Bitmapfactory.decodestream ohne Optionen, und es gibt auch etwa 50 andere, auf die in XML -Aktivitäten aufgenommen werden.

Wenn ich auf verschiedenen Geräten teste, hat das Spiel manchmal kein Gedächtnis, aber ich kann kein Muster finden und entscheiden sogar, wie viel ich muss, z. B. die Größe der Bilder oder deren Anzahl verringern.

Das Telefon, auf dem ich mich entwickelt habe, ist HTC -Wunsch mit Android 2.2 24MB VM Haufengröße nie aus.

Dell -Streifen mit Android 2,2 und 40 MB VM Haufengröße läuft auch nie.

Motorola -Meilenstein mit Android 2.1 und 24 MB VM Haufengröße lädt erfolgreich alle Sprites, aber erstickt auf den wenigen letzten Bildern, die in ImageView's beim Starten einer der Aktivitäten verwendet werden (Startmenü). Wenn ich einige von solchen Imageviews kommentiere, lädt es in Ordnung, kann aber später eine der anderen Aktivitäten ersticken. Es ist auch nicht stabil, wahrscheinlich weil die Fragmentierung in verschiedenen Starts unterschiedlich auftritt.

HTC -Held mit 2,2 meines Kumpels (nicht die Haufengröße, ist es 16 MB?) Auch abstürzt.

Am verwirrendsten ist, dass Motorola 24 MB hat, genauso wie das HTC -Wunsch. Ist 2.1 die Speicherverwaltung weniger effizient implementiert? (EG führt zu mehr Fragmentierung?) Oder ist das Speichermanagement für alle Motorola -Telefone schlechter? Warum stürzt HTC -Held dann mit 2,2 ab? Was ist im HTC -Verlangen größer als HTC -Held?

Sieht so aus, als wäre OOM auf älteren Telefonen passiert, aber das ist das einzige, was ich bisher herausgefunden habe.

Wenn OOM nur auf älteren Telefonen stattfindet, die beispielsweise 5% des Marktes sind, kann ich nur 2.1 oder eine spezifischere Liste von den unterstützten Geräten ausschließen, indem ich nur Absturzberichte sammelte und alles ausschließt, was aus der Liste der unterstützten Liste abgestürzt ist. Andernfalls müsste ich jetzt alle meine Bilder um einen konstanten Faktor (z. B. 1.6) skalieren, was bedeuten würde, dass die Größe aller 45 Ebenen, die Tage und Tage des Entwerfens und Testens, der Neupositionierung von GUI -Elementen usw. dauerten, auch danach. D ist immer noch nicht sicher, auf welche Geräte die Verringerung der Gesamtgröße der Bitmaps um den Faktor von ZB 2 ausreichen, um OOMs zu vermeiden.

Irgendwelche Ratschläge dazu? Sollte ich bestimmte Optionen für Bitmapfaktorie festlegen? Übrigens haben die meisten Bilder transparente BG -Pixel, was, soweit ich weiß, nicht zulässt, sie im 565 -Format zu bekommen.

Ich habe 2 Tage hier und an anderen Orten gesucht, bin aber immer noch ratlos.

Vielen Dank.

War es hilfreich?

Lösung

Ich musste mich mit einer einfacheren Version Ihres Problems befassen - wir hatten 3 2mpix -Ebenen übereinander, was, was nicht überraschend, manchmal ausführte.

In meinem Fall habe ich die Schichten manuell gemischt, anstatt 3 Imageviews übereinander zu verwenden, die alle 6 MPIX im Gedächtnis halten, und halte so zu jeder Zeit im Gedächtnis (und nur 2 MPIX an ", um höchstens 4 MPIX im Speicher zu halten (und nur 2 MPIX bei". Ruhe " - Die Schichten haben sich in unserer Anwendung geändert).

Dies ist ein klassischer Zeitraum-Kompromiss-Opfereffizienz (Zeit), um Gedächtnis (Raum) zu gewinnen. Es war etwas langsam, weil du musstest recycle() Jede Bitmap, nachdem Sie damit fertig waren, um sicherzustellen, dass die Erinnerung befreit wurde.

Was die inkonsistenten OOMs betrifft, hat es wahrscheinlich mit der Müllsammlung zu tun. Sie können annehmen, dass der Müllsammler nicht deterministisch ist und dass jeder Speicherdruck auch nicht deterministisch wird (je nachdem, wann der GC zuletzt eintrat).

Die kurze Zusammenfassung ist, dass Sie mit Ihrem Gedächtnisverbrauch sehr, sehr vorsichtig sein müssen und es keine Möglichkeit gibt. *

* Theoretisch könnten Sie das Gedächtnis außerhalb des Dalvik -Haufens zuweisen, indem Sie das NDK verwenden und direkt aus dem Betriebssystem zuweisen. Es ist ein großer Hack und die Brücke zwischen Dalvik und Ihrem Allocator wird ziemlich hässlich sein.

Andere Tipps

Zuerst müssen Sie herausfinden, was genau Ihr ganzer Speicher verwendet. Schau dir das an. Vielleicht könnten Sie zum Beispiel Bitmaps recyceln.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top