Android Grafiken riesigen Heap Speicherverbrauch? - LibGDX

8

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:

    
grimrader22 29.10.2014, 19:55
quelle

3 Antworten

6

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:

  1. Verwenden von nativen APIs zum Zuweisen von Speicher : Keine gute Idee, da dies die Komplexität erhöht und wenn Sie nicht vorhaben, Dinge in nativem Code zu tun,
  2. Zuordnen eines unnötig großen Objekts vor der Ausführung, um den gewünschten Heap-Speicher zu erhalten: Obwohl es Ihnen einmal genug Heap-Speicher zur Verfügung stellt, ist nicht garantiert, dass die Größe des Heapspeichers gleich bleibt.

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>     

Seyfülislam Özdemir 10.11.2014, 12:21
quelle
1

Sie können diesen Attributwert im Android-Manifest zuweisen:

android: largeHeap="true"

Hinweis: Dies funktioniert nur mit Android 3.0 +

    
Bowersbros 30.10.2014 01:01
quelle
1

Klicken Sie mit der rechten Maustaste auf das zugewiesene Objekt, wählen Sie "trace to GC root", "ohne schwache Referenzen"

Ссылка

    
konmik 30.10.2014 09:07
quelle

Tags und Links