Frage

Ich bin nicht so neu in die Konzepte, die auf J2ME, aber ich bin irgendwie faul in einer Weise, ich sollte nicht: In letzter Zeit meine App wurde Bilder in den Speicher geladen, wie sie Süßigkeiten waren ...

Sprite example = new Sprite(Image.createImage("/images/example.png"), w, h);

, und ich bin nicht wirklich sicher, es ist die beste Art und Weise, aber es funktionierte in meinem Motorola Z6 in Ordnung, bis gestern Abend, als ich die App in einem alten Samsung Handy getestet und die Bilder nicht sogar Last und erfordern mehrere Anläufe des Startens der Faden zu zeigen. Der Bildschirm wurde auf weiß gelassen, so erkannte ich, dass es etwas über Bild wird geladen sein muss, dass ich nicht ganz gut ... Gibt es jemanden, der mir sagen kann, wie man richtig eine Laderoutine in meiner app machen?.

War es hilfreich?

Lösung

Ich bin nicht genau sicher, was Sie suchen, aber das Verhalten, das Sie beschreiben sehr viel klingt wie Sie eine OutOfMemory Ausnahme auftritt. Versuchen Sie, die Dimensionen der Bilder zu reduzieren (Heap-Nutzung auf Dimension basiert) und sehen, ob das Verhalten aufhört. Auf diese Weise können Sie wissen, ob es wirklich ein OutOfMemory Problem oder etwas anderes ist.

Weitere Tipps:

  1. Bilder laden größten bis zum kleinsten. Dies hilft bei der Heapfragmentierung und ermöglicht den größten Heap-Speicher für die größten Bilder.
  2. Unload (auf null) in umgekehrter Reihenfolge, wie Sie geladen und Müll sammeln, nachdem dies zu tun. Achten Sie darauf, Thread.yield (), nachdem Sie den GC nennen.
  3. Stellen Sie sicher, dass Sie nur die Bilder laden, die Sie benötigen. Entlasten Sie Bilder von einem Zustand, dass die Anwendung nicht mehr.
  4. Da Sie Sprites erstellen können Sie mehrere Sprites für ein Bild haben. Betrachten wir ein Bild Pool zu schaffen, um sicherzustellen, dass Sie nur einmal das Bild laden. Zeigen Sie dann nur jedes Sprite-Objekt auf das Bild innerhalb des Pools, die es erfordert. Ihr Beispiel in Ihrer Frage scheint, wie Sie würde mehr als wahrscheinlich das gleiche Bild in den Speicher mehr als einmal laden. Das ist verschwenderisch und könnte einen Teil des OutOfMemory Problems sein.

Andere Tipps

Unter Verwendung ein Filmbild (einen Satz von Bildern, um eine definierte Dimension in einem Bild), und sie verwenden Logik zu einem Zeitpunkt ein ziehen.

Weil sie ein zu einem Bild zusammengefasst, die Sie speichern Kopfraum pro Bild und damit den Speicher reduzieren.

Diese Techniken wurden zuerst in MIDP 1.0-Speichern beschränkt Geräten verwendet.

Mit dem Fostah Ansatz der Bilder nicht immer und immer wieder laden, habe ich die folgende Klasse:

public class ImageLoader {
    private static Hashtable pool = new Hashtable();

    public static Image getSprite(String source){
        if(pool.get(source) != null) return (Image) pool.get(source);
        try {
            Image temp = Image.createImage(source);
            pool.put(source, temp);
            return temp;
        } catch (IOException e){
            System.err.println("Error al cargar la imagen en "+source+": "+e.getMessage());
        }
        return null;
    }
}

Also, wenn ich ein Bild brauche zuerst frage ich den Pool für sie, oder es einfach in den Pool laden.

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