2009-05-28 12 views
2

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

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

et je ne suis pas sûr que ce soit le meilleur moyen, mais ça a bien fonctionné dans mon Motorola Z6, jusqu'à hier soir, quand j'ai testé l'application dans un vieux téléphone portable Samsung et les images ne chargeront même pas le fil à montrer. L'écran est resté blanc, alors j'ai réalisé qu'il devait y avoir quelque chose à propos du chargement de l'image que je ne fais pas très bien ... Y at-il quelqu'un qui peut me dire comment faire correctement une routine de chargement dans mon application?

+0

Pourriez-vous être un peu plus clair sur ce que vous essayez d'obtenir hors de l'image ou quelque chose comme – Ram

Répondre

4

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

Autres conseils:

  1. Charger les images grand au plus petit. Cela aide avec la fragmentation de tas et permet le plus grand espace de tas pour les plus grandes images.
  2. Déchargez (définissez à null) dans l'ordre inverse de la façon dont vous avez chargé et collecte des ordures après cela. Assurez-vous de Thread.yield() après avoir appelé le GC.
  3. Assurez-vous de ne charger que les images dont vous avez besoin. Déchargez les images d'un état dans lequel l'application n'est plus active.
  4. Puisque vous créez des sprites, vous pouvez avoir plusieurs images-objets pour une image. Envisagez de créer un pool d'images pour vous assurer de ne charger l'image qu'une seule fois. Puis pointez simplement chaque objet Sprite sur l'image dans le pool dont il a besoin. Votre exemple dans votre question semble que vous chargeriez plus que probablement la même image dans la mémoire plus d'une fois. C'est un gaspillage et cela pourrait faire partie du problème OutOfMemory.
+1

grâce à Fostah! vraiment utile, le pool d'images, je l'ai utilisé auparavant, mais en utilisant Java2D dans un jeu de bureau, donc ce ne serait pas un problème de le faire à nouveau. Je dois encore polir un peu, j'ai besoin de savoir comment structurer mon application. Dernièrement mon application est threadish, j'ai deux toiles, chacune implémentant Runnable, une pour le menu et l'autre pour le gameplay, suis-je en train de faire ça? – fixmycode

+0

Mes jeux J2ME ont toujours consisté en 1 toile et plusieurs états de jeu. Ensuite, run() pour le canevas a la boucle de mise à jour. Avoir plusieurs instances de Canvas ne devrait vraiment pas être nécessaire étant donné que les états n'existent jamais en même temps. Découvrez la programmation de jeux J2ME par Martin Wells. C'est un livre génial et très utile pour vous. – Fostah

0

En utilisant l'approche Fostah de ne pas le chargement des images à plusieurs reprises, je 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; 
    } 
} 

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

1

Utilisation d'une image de film (ensemble d'images d'une dimension définie dans une image) et utilisation de la logique pour les extraire une à la fois. Parce qu'ils sont groupés dans une image, vous économisez de l'espace d'en-tête par image et pouvez ainsi réduire la mémoire utilisée.

Cette technique a été utilisée pour la première fois dans des dispositifs contraints à la mémoire MIDP 1.0.