2012-12-19 16 views
9

Ich erstelle dieses Android-Spiel in Java. Ich habe ziemlich viele Bilder, muss sie aber nicht alle auf einmal verwenden, daher habe ich eine Resource Manager-Klasse erstellt, die sich um die verwendeten Bitmaps kümmert. Allerdings habe ich es ziemlich langsam gefunden, die Bitmap aus dem Speicher zu löschen. Ich bin derzeit so etwas wie dies zu tun:Bitmaps schnell aus dem Speicher entladen

bitmap.recycle() 
bitmap = null 

System.gc (also tried Runtime.getRuntime().gc()) 

Zum einen ist es eine Möglichkeit, um schneller die Bitmaps aus dem Speicher zu entladen oder ist es möglich, irgendwie zu überprüfen, ob sie so tatsächlich gelöscht Ich kann den Ladebildschirm machen, hängt von das auch?

+2

Sie könnten in Betracht ziehen, eine vorhandene Bitmap-Caching-Engine zu verwenden, statt Ihre eigene zu rollen: http://www.senab.co.uk/2012/12/18/android-bitmapcache-the-rebirth/ – CommonsWare

+1

Der Grund dafür ist langsam Rufst du den GC an? Lass es laufen, wenn es benötigt wird. +1 @CommonsWare keine Notwendigkeit, das Rad neu zu erfinden. – iagreen

+4

aufrufen.recycle() und auf null setzen sollte eigentlich nur tun. Kein Aufruf von .gc() :) –

Antwort

0

Wie SylvainL sagte, sammelt System.gc und Freunde den vollen Müll und kann ziemlich langsam sein. Die Java-Maschine führt den GC periodisch aus, und die Periode wird fein abgestimmt, je nachdem wie viel freier Speicher zu einem bestimmten Zeitpunkt verfügbar ist.

Die beste Wahl für mich ist die Verwendung einer Art Bitmap-Pooling: Vordefinierte Bitmap-Instanzen, die Sie aus dem Pool abrufen und freigeben können, und Verwalten von Buffer-Instanzen in einem Cache mithilfe von LRU-Richtlinien.

Mit der richtigen Feinabstimmung können Sie beim Erstellen und Löschen von Bitmap-Instanzen keine Kosten verursachen, da sie gepoolt werden. Pufferinstanzen mit Bitmap-Daten werden je nach Verwendung dynamisch in den Arbeitsspeicher geladen und daraus entladen.

1

Es gibt keine Garantie, dass der Garbage Collector tatsächlich ausgeführt wird, wenn wir versuchen, System.gc() als gc() erwartet bestimmte Voraussetzungen wie Ressource Hunger. Es ist also offensichtlich, dass der Aufruf von gc() nur kritische CPU-Zyklen verschwendet. Als Entwickler können wir unnötige Objekte für gc collectable machen, indem wir die Referenzen annullieren.

Es gibt einige Optimierungstechniken, die beim Erstellen eines Spielsystems (Spiels) hilfreich sein können.

  1. Textur verwenden. Hier ist ein example.

  2. Verwenden Sie Sprite und SpriteSheets (es gibt weniger Systemaufwand als das Laden einzelner Bitmaps). Viele Open-Source-Spiele-Engines sind da, die das verwenden. Wenn Sie sie nicht verwenden möchten, erhalten Sie eine Idee, wie Sie diese Quellen neu erstellen können.

  3. Verwenden Sie diese Standard-Android-Doc für Loading Large Bitmaps Efficiently und Caching Bitmaps für eine bessere Verwendung von Bitmap. Die Idee ist, wenn Benutzer Gerät nicht effizient genug ist, um die Menge der Verarbeitung zu handhaben und/oder der Speicher weniger für Ihr Spiel ist, können Sie die Bitmap immer verkleinern (Kompromiss mit Qualität für bessere Antwort).

  4. Testen Sie Ihre App immer auf Speicherleckprobleme. Hier ist eine nice post, die helfen wird.

  5. Keep InMemory (nicht freigegeben einmal verwendet) Elemente, die mehrmals innerhalb des Spiels in der gleichen Szene verwendet werden. Der Grund ist, dass es viel Zeit braucht, um Bilder in den Speicher zu laden.

Hoffe, das wird Ihnen helfen.

Verwandte Themen