Question

Je ne suis pas nouveau pour les concepts présents sur J2ME, mais je suis un peu paresseux façons je ne: Dernièrement mon application a été chargement des images dans la mémoire comme ils étaient des bonbons ...

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

et je ne suis pas vraiment sûr que c'est la meilleure façon, mais il a bien fonctionné dans mon Motorola Z6, jusqu'à hier soir, quand je l'ai testé l'application dans un ancien téléphone portable Samsung et les images wont même charge et nécessitent plusieurs tentatives de départ le fil à apparaître. L'écran a été laissé sur blanc, donc je compris qu'il doit être quelque chose sur le chargement de l'image que je ne fais pas assez bien ... Est-ce qu'il ya quelqu'un qui peut me dire comment faire correctement une routine de chargement dans mon application?.

Était-ce utile?

La solution

Je ne sais pas exactement ce que vous cherchez, mais le comportement que vous décrivez ressemble beaucoup à vous rencontrez une exception OutOfMemory. Essayez de réduire les dimensions de vos images (utilisation du tas est basée sur la dimension) et voir si le comportement cesse. Cela vous permettra de savoir si elle est vraiment un problème OutOfMemory ou autre chose.

Autres conseils:

  1. Charger les images grand au plus petit. Cela contribue à la fragmentation du tas et permet au plus grand espace de tas pour les plus grandes images.
  2. Unload (ensemble null) dans l'ordre inverse de la façon dont vous avez chargé et déchets recueillir après l'avoir fait. Assurez-vous de Thread.yield () après avoir appelé le GC.
  3. Assurez-vous de charger uniquement les images que vous avez besoin. Décharger images à partir d'un état que l'application n'est plus.
  4. Puisque vous créez sprites vous pouvez avoir plusieurs sprites pour une image. Envisager la création d'un pool d'image pour vous assurer que vous chargez uniquement l'image une fois. Ensuite, il suffit pointer chaque objet Sprite à l'image dans la piscine dont elle a besoin. Votre exemple dans votre question semble comme vous le feriez plus de charger probablement la même image en mémoire plus d'une fois. C'est inutile et pourrait faire partie de la question OutOfMemory.

Autres conseils

Utilisation d'une image de film (un ensemble d'images en une dimension définie dans une image) et en utilisant la logique de les retirer un à la fois.

Parce qu'ils a regroupés en une seule image, vous enregistrez l'espace d'en-tête par image et peut ainsi réduire la mémoire utilisée.

Cette technique a d'abord été utilisés dans des dispositifs mémoire MIDP 1.0 contraints.

En utilisant l'approche Fostah de ne pas le chargement d'images à plusieurs reprises, j'ai fait la classe suivante:

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;
    }
}

Alors, chaque fois que je besoin d'une image que je demande d'abord la piscine pour elle, ou tout simplement le charger dans la piscine.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top