Bonjour à tous les coders !!
Je travaille actuellement sur un jeu en J2ME (MIDP 1.0) qui me pose un petit problème de mémoire. J'ai 3 classes au total (la midlet, un canvas qui s'occuppe de la gestion et de l'affichage des menus, un canvas qui prend en charge la gestion et le rendu du jeu).
A l'heure actuelle, la midlet arrive à passer d'un canvas à l'autre sans problème, mais il semblerait qu'elle n'arrive pas à nettoyer la mémoire (retirer toute trace d'un canvas avant de lancer l'autre) ce qui pose un gros problème de heap. Est-il seulement possible d'effacer un canvas de la mémoire ? lorsqu'un objet est créé à partir d'un canvas, existe-t-il vraiment en mémoire avec toutes ses methodes héritées ? Cela a-t-il un sens de vouloir gagner de la place de heap en essayant de supprimer l'objet canvas instancié ?
voici le code de la methode startApp() de la midlet (appellé à chaque changement de mode) :
Chaque canvas possède son thread et j'ai des system.out.println dans leur methode run() qui m'indiquent qu'une fois lancé, le thread ne finit jamais (ce qui fait qu'au final je vois les 2 se manifester dans la fenetre de sortie) j'en conclue que mon code ne parvient pas à effacer l'objet canvas devenu inutile.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 protected void startApp() { if (!started) { started = true; display = Display.getDisplay(this); exitCommand = new Command("Exit", Command.EXIT, 0 ); } if (menu_mode) // ce booleen permet d'identifier le canvas à utiliser { // Mode MENU System.out.println("Switching display to Menu..."); game_canvas = null; //censé "vider" l'objet canvas ? System.gc(); menu_canvas = new MenuCanvas(this); // l'objet canvas pour le menu } else { // Mode race engine System.out.println("Switching display to race engine..."); menu_canvas = null; System.gc(); game_canvas = new GameCanvas(this); // l'objet canvas pour le jeu } display.setCurrent(the_canvas); }
Lorsque je passe d'un canvas à l'autre, j'essaie de "tuer" le processus avec le code qui suit :
t = null;
J'espère que vous pourrez m'eclairer et je vous en remercie par avance !!
bon code à vous.
Partager