Ich habe derzeit eine leere LibGDX
-Anwendung, die nichts tut. Es macht nichts, noch aktualisiert es irgendetwas. Es ist nur ein leeres Screen
. Wenn ich die Anwendung auf Android bereitstellen, werde ich mit einigen entsetzlichen Speicherverbräuchen begrüßt. Unter Verwendung von DDMS erstelle ich den folgenden Heap-Dump, wenn die Anwendung auf meinem Gerät ausgeführt wird:
Die bedeutendste Speicherbelegung ist die 13.163 MB 1-Byte-Array-Zuweisung. Ist das nicht die Hälfte des Heaps?!
Ich habe die Zuweisungen überprüft und festgestellt, dass nichts darauf hinweist, dass diese Größe zugewiesen wurde:
Nun benutze ich Eclipse MAT und analysiere den Heap Dump:
Daher kommt die hohe Speicherauslastung immer noch von byte [] - Arrays. Beim Analysieren des Abschnitts byte [] komme ich dazu:
Ich sehe jetzt, dass die riesigen Byte [] Zuordnungen von den Android-Grafiken kommen. Ich zeichne überhaupt nichts! Gibt es eine Möglichkeit, die ich vermeiden kann, dass der Android-Grafik-Teil dieser App die Hälfte des Heaps belegt. Dies führt nur dazu, dass überschüssige Speicherbereinigung stattfindet, wenn die Dinge tatsächlich stattfinden, oder ist das normal und ich muss mich nur damit befassen?
Hinweis: Ich betreibe dies auf einem Samsung Galaxy S4 mit libGDX Version 1.4 (oder was auch immer die neueste Version ist)
UPDATE: Ich habe nicht festgestellt, dass die 14-13MB Byte-Array-Zuweisung für Anwendungen normal ist, aber ich habe immer noch ein Problem. Meine Heap-Größe ist zu klein. Wenn die androiden Grafiken die Hälfte meines Heaps einnehmen, habe ich wenig Platz für irgendwas Nützliches und der Müllsammler wird verrückt. Auf einer anderen Anwendung habe ich mit einer älteren Version von libgdx (eine unbestreitbar schlechter codierte Anwendung) erstellt und die Heap-Größe beträgt 73 Mb. Wie kann ich die Größe des Heapspeichers erhöhen? Ich nehme an, 73 Mb ist ziemlich groß und wie Sie sehen können, wird das meiste davon nicht benutzt. Hier sind die Heap-Statistiken der älteren Anwendung:
Nach der Android-Version 2.3 können Sie mit der Größe des Heapspeichers nichts anderes tun als mit dem Attribut android: largeHeap.
Es gibt zwei Möglichkeiten, zu betrügen, wenn ein großer Heap sein soll, egal was:
Die anfängliche Größe des Heapspeichers ist jedoch kein Problem, wenn die Größe bei Bedarf geändert wird. Meine Meinung über die Speicherverwaltung in einem Spiellebenszyklus ist ein bisschen anders als die beiden oben aufgeführten Dinge und was du wahrscheinlich tust.
Für ein Level, eine Bühne usw. sollten Sie den Speicher nicht genau zu dem Zeitpunkt reservieren, zu dem Sie ihn benötigen. Dies führt nicht nur zu Stottern beim Zuweisen von Speicher, sondern auch zu Stottern wegen möglicher Speicher-E / A. Alles, wie Töne, Grafiken, Schriften usw. sollte vor einem Level vorbereitet werden. Aus diesem Grund haben viele Spiele einen "Lade" -Bildschirm. Sie sollten alles vorbereiten, was Sie tun können, bevor Sie das Spiel beginnen.
Für eine kleine Bühne ist das OK - aber immer noch nicht gut. Wenn die Dinge komplex werden, wird die Leistung sinken. Viele Spiele (wie Sportspiele, Rennspiele usw.) erledigen die Zuordnung vor dem Spielstart. Andere machen es so stark wie sie können . Einige Open-World-Spiele (wie GTA) laden nicht alle Kartenobjekte in der Karte, aber sie haben eine Zeichnungsentfernung, also zeichnen sie, während Sie sich in der Karte bewegen, und entfernen die entferntesten Objekte aus dem Speicher, wenn der Speicher keinen Platz mehr hat .
[Der Grund, warum Ihre App mit älterer LibGDX-Version mehr Heap-Größe hat, ist wahrscheinlich eine Zuweisung, die eine Erhöhung der Heap-Größe und eine Freigabe verursachte, wodurch ein Teil des Heaps freigegeben wurde, so dass Sie gut 30% verwenden können / p>
Sie können diesen Attributwert im Android-Manifest zuweisen:
Hinweis: Dies funktioniert nur mit Android 3.0 +