destruction d'objet canvas.
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) :
Code:
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);
} |
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.
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.
erreur dans le code inseré
je repost car il y a une erreur dans le code que j'ai introduit : le "setCurrent" doit êtr fait avec le bon objet canvas en argument :
Code:
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 31
| 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
display.setCurrent(menu_canvas);
}
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(game_canvas);
}
display.setCurrent(the_canvas);
} |
désolé pour cette erreur