Gestion de memoire pour afficher des couleurs compliquees
6 réponses
Yohann
Bonjour,
Je programme en java sous AWT un logiciel qui affiche des courbes du type z=f(x,
y).
Pour un meilleur rendu, j'utilise un grand nombre de couleurs en utilisant new
Color(int,int,int,int)(pour fixer le taux de bleu rouge et vert dans la couleur).
Mais apparemment, plus j'utilise de couleurs, plus le programme prend de la
mémoire vive (jusqu'à 120Mo).Par contre si je trace en une couleur, le noir, il
ne prends pas trop de mémoire vive (10Mo). J'aimerais comprendre ce qu'il se
passe et bien sûr y remedier.
Merci pour votre aide
Yohann
--
Ce message a été posté via la plateforme Web club-Internet.fr
This message has been posted by the Web platform club-Internet.fr
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Nicolas Repiquet
"Yohann" a écrit dans le message news:
Bonjour, Je programme en java sous AWT un logiciel qui affiche des courbes du type z=f(x,
y). Pour un meilleur rendu, j'utilise un grand nombre de couleurs en utilisant new
Color(int,int,int,int)(pour fixer le taux de bleu rouge et vert dans la couleur).
Color(int,int,int,int) créé une couleur avec une composante alpha ( c'est à dire une information de transparence ). Utilise le constructeur Color(int,int,int) si tu ne t'en sert pas.
Mais apparemment, plus j'utilise de couleurs, plus le programme prend de la
mémoire vive (jusqu'à 120Mo).
Il faudrait qu'on voit ta boucle de dessin pour savoir. A priori je dirai que tu recréé des objet Color à chaque pixel, selon le nombre de pixels, la mémoire peut se remplir assez vite de vieux objet Color qui n'on pas encore été GarbageCollectés.
Par contre si je trace en une couleur, le noir, il ne prends pas trop de mémoire vive (10Mo). J'aimerais comprendre ce qu'il se
passe et bien sûr y remedier.
Il nous faut ton code source pour pouvoir dire ça. Fait un copier/coller de ta boucle de dessin.
-- Nicolas Repiquet
"Yohann" <jjrousseau@wanadoo.fr> a écrit dans le message news:
2003918-164957-508660@foorum.com...
Bonjour,
Je programme en java sous AWT un logiciel qui affiche des courbes du type
z=f(x,
y).
Pour un meilleur rendu, j'utilise un grand nombre de couleurs en utilisant
new
Color(int,int,int,int)(pour fixer le taux de bleu rouge et vert dans la
couleur).
Color(int,int,int,int) créé une couleur avec une composante alpha ( c'est à
dire une information de transparence ). Utilise le constructeur
Color(int,int,int) si tu ne t'en sert pas.
Mais apparemment, plus j'utilise de couleurs, plus le programme prend de
la
mémoire vive (jusqu'à 120Mo).
Il faudrait qu'on voit ta boucle de dessin pour savoir. A priori je dirai
que tu recréé des objet Color à chaque pixel, selon le nombre de pixels, la
mémoire peut se remplir assez vite de vieux objet Color qui n'on pas encore
été GarbageCollectés.
Par contre si je trace en une couleur, le noir, il
ne prends pas trop de mémoire vive (10Mo). J'aimerais comprendre ce qu'il
se
passe et bien sûr y remedier.
Il nous faut ton code source pour pouvoir dire ça. Fait un copier/coller de
ta boucle de dessin.
Bonjour, Je programme en java sous AWT un logiciel qui affiche des courbes du type z=f(x,
y). Pour un meilleur rendu, j'utilise un grand nombre de couleurs en utilisant new
Color(int,int,int,int)(pour fixer le taux de bleu rouge et vert dans la couleur).
Color(int,int,int,int) créé une couleur avec une composante alpha ( c'est à dire une information de transparence ). Utilise le constructeur Color(int,int,int) si tu ne t'en sert pas.
Mais apparemment, plus j'utilise de couleurs, plus le programme prend de la
mémoire vive (jusqu'à 120Mo).
Il faudrait qu'on voit ta boucle de dessin pour savoir. A priori je dirai que tu recréé des objet Color à chaque pixel, selon le nombre de pixels, la mémoire peut se remplir assez vite de vieux objet Color qui n'on pas encore été GarbageCollectés.
Par contre si je trace en une couleur, le noir, il ne prends pas trop de mémoire vive (10Mo). J'aimerais comprendre ce qu'il se
passe et bien sûr y remedier.
Il nous faut ton code source pour pouvoir dire ça. Fait un copier/coller de ta boucle de dessin.
-- Nicolas Repiquet
Yohann
Bonjour, Voici la fonction qui renvoie une couleur à la méthode paint : private Color Couleur(int i, int j) { if(Coloriage==0) return Color.black; else if(Coloriage==1 || zmin==zmax) { //Color.RGBtoHSB((i*255)/grid,(j*255)/grid,128,toto); //return Color.getHSBColor(toto[0],toto[1],toto[2]); return new Color((i*255)/grid,(j*255)/grid,128); } else if(Coloriage==2) return new Color((i*255)/grid,(j*255)/grid,(int) (255*(t[i][j]/(zmax-zmin)+0. 5))); else return Color.getHSBColor((float) (t[i][j]/(zmax-zmin)+0.5),1, 1); } Les deux coloriages qui prennent de la mémoire sont les 1 et 2. J'ai changé ma façon de faire (voir les 2 lignes en commentaires) pour ne plus créer de nouveaux objets color, mais cela ne change rien. En fait plus on affiche de couleurs différentes, plus ca prend de la mémoire. Pour en être sur, j'ai changé la dernière ligne par else return Color.getHSBColor((float) (t[i][j]/(zmax-zmin)+0.5),Math.random(), Math.random()); et cela entraine une augmentation de la mémoire utilisée. Le fait que le programme utilise beaucoup de mémoire vient vraiment du fait qu'il y a beaucoup de couleurs différentes sur l'écran: si je trace des lignes que j'efface ensuite dans la méthode paint, le programme prend moins de mémoire que si je n'en efface pas. Deplus, augmenter le nombre de pixels "peints" sans changer le nombre de couleurs n'augmente pas la mémoire utilisée. Je ne sais pas si je devrais dessiner sur un objet spécial (j'utilise un panel) ou passer à SWING Merci pour votre aide Yohann -- Ce message a été posté via la plateforme Web club-Internet.fr This message has been posted by the Web platform club-Internet.fr
http://forums.club-internet.fr/
Bonjour,
Voici la fonction qui renvoie une couleur à la méthode paint :
private Color Couleur(int i, int j)
{
if(Coloriage==0)
return Color.black;
else if(Coloriage==1 || zmin==zmax)
{ //Color.RGBtoHSB((i*255)/grid,(j*255)/grid,128,toto);
//return Color.getHSBColor(toto[0],toto[1],toto[2]);
return new Color((i*255)/grid,(j*255)/grid,128);
}
else if(Coloriage==2)
return new Color((i*255)/grid,(j*255)/grid,(int) (255*(t[i][j]/(zmax-zmin)+0.
5)));
else return Color.getHSBColor((float) (t[i][j]/(zmax-zmin)+0.5),1, 1);
}
Les deux coloriages qui prennent de la mémoire sont les 1 et 2. J'ai changé ma
façon de faire (voir les 2 lignes en commentaires) pour ne plus créer de
nouveaux objets color, mais cela ne change rien. En fait plus on affiche de
couleurs différentes, plus ca prend de la mémoire. Pour en être sur, j'ai changé
la dernière ligne par
else return Color.getHSBColor((float) (t[i][j]/(zmax-zmin)+0.5),Math.random(),
Math.random()); et cela entraine une augmentation de la mémoire utilisée. Le
fait que le programme utilise beaucoup de mémoire vient vraiment du fait qu'il y
a beaucoup de couleurs différentes sur l'écran: si je trace des lignes que
j'efface ensuite dans la méthode paint, le programme prend moins de mémoire que
si je n'en efface pas. Deplus, augmenter le nombre de pixels "peints" sans
changer le nombre de couleurs n'augmente pas la mémoire utilisée. Je ne sais pas
si je devrais dessiner sur un objet spécial (j'utilise un panel) ou passer à
SWING
Merci pour votre aide
Yohann
--
Ce message a été posté via la plateforme Web club-Internet.fr
This message has been posted by the Web platform club-Internet.fr
Bonjour, Voici la fonction qui renvoie une couleur à la méthode paint : private Color Couleur(int i, int j) { if(Coloriage==0) return Color.black; else if(Coloriage==1 || zmin==zmax) { //Color.RGBtoHSB((i*255)/grid,(j*255)/grid,128,toto); //return Color.getHSBColor(toto[0],toto[1],toto[2]); return new Color((i*255)/grid,(j*255)/grid,128); } else if(Coloriage==2) return new Color((i*255)/grid,(j*255)/grid,(int) (255*(t[i][j]/(zmax-zmin)+0. 5))); else return Color.getHSBColor((float) (t[i][j]/(zmax-zmin)+0.5),1, 1); } Les deux coloriages qui prennent de la mémoire sont les 1 et 2. J'ai changé ma façon de faire (voir les 2 lignes en commentaires) pour ne plus créer de nouveaux objets color, mais cela ne change rien. En fait plus on affiche de couleurs différentes, plus ca prend de la mémoire. Pour en être sur, j'ai changé la dernière ligne par else return Color.getHSBColor((float) (t[i][j]/(zmax-zmin)+0.5),Math.random(), Math.random()); et cela entraine une augmentation de la mémoire utilisée. Le fait que le programme utilise beaucoup de mémoire vient vraiment du fait qu'il y a beaucoup de couleurs différentes sur l'écran: si je trace des lignes que j'efface ensuite dans la méthode paint, le programme prend moins de mémoire que si je n'en efface pas. Deplus, augmenter le nombre de pixels "peints" sans changer le nombre de couleurs n'augmente pas la mémoire utilisée. Je ne sais pas si je devrais dessiner sur un objet spécial (j'utilise un panel) ou passer à SWING Merci pour votre aide Yohann -- Ce message a été posté via la plateforme Web club-Internet.fr This message has been posted by the Web platform club-Internet.fr
http://forums.club-internet.fr/
Nicolas Repiquet
"Yohann" a écrit dans le message news:
return Color.black;
Cette ligne de créé pas d'objet couleur, elle se contente d'utiliser toujours le même, à savoir Color.black;
return new Color((i*255)/grid,(j*255)/grid,128);
Cette ligne par contre créé un nouvel objet.
return new Color((i*255)/grid,(j*255)/grid,(...
Celle là aussi
else return Color.getHSBColor((float) (t[i][...
Ainsi que celle là.
Je supose que ta méthode "Couleur" est appelée pour chaque pixel ? Donc en mode coloriage 1 ou 2 elle crée autant d'objet couleur qu'il y a de pixel.
Le objets ne sont pas effacer dès qu'on ne les utilise plus, il reste en mémoire pour une durée indéterminée, jusqu'a ce que l'application est besoin de plus de mémoire encore et qu'elle décide de faire le ménage.
Ceci dit, à moins que tu ais beaucoup de pixels, ou que tu les redessines souvent, ça n'explique pas les 120mo.
Les deux coloriages qui prennent de la mémoire sont les 1 et 2. J'ai changé ma
façon de faire (voir les 2 lignes en commentaires) pour ne plus créer de nouveaux objets color, mais cela ne change rien.
Normal, ton code continue à produire des objets comme avant. Il faut que tu trouve un moyen de réutiliser les objets Color, ou de t'en passer. Il faudrait qu'on en sache plus sur ton code pour ça ( comme par exemple, que dessines-tu ? Est-ce une animation ou une image fixe ? etc )
-- Nicolas Repiquet
"Yohann" <roger@wanadoo.com> a écrit dans le message news:
2003919-184333-651741@foorum.com...
return Color.black;
Cette ligne de créé pas d'objet couleur, elle se contente d'utiliser
toujours le même, à savoir Color.black;
return new Color((i*255)/grid,(j*255)/grid,128);
Cette ligne par contre créé un nouvel objet.
return new Color((i*255)/grid,(j*255)/grid,(...
Celle là aussi
else return Color.getHSBColor((float) (t[i][...
Ainsi que celle là.
Je supose que ta méthode "Couleur" est appelée pour chaque pixel ? Donc en
mode coloriage 1 ou 2 elle crée autant d'objet couleur qu'il y a de pixel.
Le objets ne sont pas effacer dès qu'on ne les utilise plus, il reste en
mémoire pour une durée indéterminée, jusqu'a ce que l'application est besoin
de plus de mémoire encore et qu'elle décide de faire le ménage.
Ceci dit, à moins que tu ais beaucoup de pixels, ou que tu les redessines
souvent, ça n'explique pas les 120mo.
Les deux coloriages qui prennent de la mémoire sont les 1 et 2. J'ai
changé ma
façon de faire (voir les 2 lignes en commentaires) pour ne plus créer de
nouveaux objets color, mais cela ne change rien.
Normal, ton code continue à produire des objets comme avant. Il faut que tu
trouve un moyen de réutiliser les objets Color, ou de t'en passer. Il
faudrait qu'on en sache plus sur ton code pour ça ( comme par exemple, que
dessines-tu ? Est-ce une animation ou une image fixe ? etc )
Cette ligne de créé pas d'objet couleur, elle se contente d'utiliser toujours le même, à savoir Color.black;
return new Color((i*255)/grid,(j*255)/grid,128);
Cette ligne par contre créé un nouvel objet.
return new Color((i*255)/grid,(j*255)/grid,(...
Celle là aussi
else return Color.getHSBColor((float) (t[i][...
Ainsi que celle là.
Je supose que ta méthode "Couleur" est appelée pour chaque pixel ? Donc en mode coloriage 1 ou 2 elle crée autant d'objet couleur qu'il y a de pixel.
Le objets ne sont pas effacer dès qu'on ne les utilise plus, il reste en mémoire pour une durée indéterminée, jusqu'a ce que l'application est besoin de plus de mémoire encore et qu'elle décide de faire le ménage.
Ceci dit, à moins que tu ais beaucoup de pixels, ou que tu les redessines souvent, ça n'explique pas les 120mo.
Les deux coloriages qui prennent de la mémoire sont les 1 et 2. J'ai changé ma
façon de faire (voir les 2 lignes en commentaires) pour ne plus créer de nouveaux objets color, mais cela ne change rien.
Normal, ton code continue à produire des objets comme avant. Il faut que tu trouve un moyen de réutiliser les objets Color, ou de t'en passer. Il faudrait qu'on en sache plus sur ton code pour ça ( comme par exemple, que dessines-tu ? Est-ce une animation ou une image fixe ? etc )
-- Nicolas Repiquet
Yohann
Je n'utilise pas cette fonction pour chaque pixel mais seulement 400 fois (quelque soit la taille de l'image) pour dessiner 400 traits. Et je répète, d'après les observations que j'ai faites, que d'après moi, c'est l'affichage des couleurs qui pose problème (voir les observations dans la dernière partie de mon message précédent). Mon programme fait de la 3D, il doit donc effacer les lignes qui sont derriere d'autres lignes. s'il le fait, il a donc moins de couleurs à afficher et donc prends moins de mémoire (alors que le nombre d'appels à couleur(i,j) est toujours de 400). S'il ne le fait pas, il prends plus de mémoire. De plus si j'augmente le nombre de pixels (en augmentant la taille de la fenetre, le dessin s'adapte et crée des traits plus grands mais le nombre d'appel à la fonction couleur(i,j) est toujours de 400), il ne prend pas plus de mémoire. le dernier test que j'ai fait : j'ai enlevé de mon code le tracage des ligne (g. drawLine(....) tout en gardant les appels couleur(i,j) ( g.setColor(Couleur(i, j)) . Dans ce cas là, le programme ne prends pratiquement plus de mémoire. en tous cas merci de ton aide.mon programme produit une image fixe -- Ce message a été posté via la plateforme Web club-Internet.fr This message has been posted by the Web platform club-Internet.fr
http://forums.club-internet.fr/
Je n'utilise pas cette fonction pour chaque pixel mais seulement 400 fois
(quelque soit la taille de l'image) pour dessiner 400 traits. Et je répète,
d'après les observations que j'ai faites, que d'après moi, c'est l'affichage des
couleurs qui pose problème (voir les observations dans la dernière partie de mon
message précédent). Mon programme fait de la 3D, il doit donc effacer les lignes
qui sont derriere d'autres lignes. s'il le fait, il a donc moins de couleurs à
afficher et donc prends moins de mémoire (alors que le nombre d'appels à
couleur(i,j) est toujours de 400). S'il ne le fait pas, il prends plus de
mémoire. De plus si j'augmente le nombre de pixels (en augmentant la taille de
la fenetre, le dessin s'adapte et crée des traits plus grands mais le nombre
d'appel à la fonction couleur(i,j) est toujours de 400), il ne prend pas plus de
mémoire.
le dernier test que j'ai fait : j'ai enlevé de mon code le tracage des ligne (g.
drawLine(....) tout en gardant les appels couleur(i,j) ( g.setColor(Couleur(i,
j)) . Dans ce cas là, le programme ne prends pratiquement plus de mémoire.
en tous cas merci de ton aide.mon programme produit une image fixe
--
Ce message a été posté via la plateforme Web club-Internet.fr
This message has been posted by the Web platform club-Internet.fr
Je n'utilise pas cette fonction pour chaque pixel mais seulement 400 fois (quelque soit la taille de l'image) pour dessiner 400 traits. Et je répète, d'après les observations que j'ai faites, que d'après moi, c'est l'affichage des couleurs qui pose problème (voir les observations dans la dernière partie de mon message précédent). Mon programme fait de la 3D, il doit donc effacer les lignes qui sont derriere d'autres lignes. s'il le fait, il a donc moins de couleurs à afficher et donc prends moins de mémoire (alors que le nombre d'appels à couleur(i,j) est toujours de 400). S'il ne le fait pas, il prends plus de mémoire. De plus si j'augmente le nombre de pixels (en augmentant la taille de la fenetre, le dessin s'adapte et crée des traits plus grands mais le nombre d'appel à la fonction couleur(i,j) est toujours de 400), il ne prend pas plus de mémoire. le dernier test que j'ai fait : j'ai enlevé de mon code le tracage des ligne (g. drawLine(....) tout en gardant les appels couleur(i,j) ( g.setColor(Couleur(i, j)) . Dans ce cas là, le programme ne prends pratiquement plus de mémoire. en tous cas merci de ton aide.mon programme produit une image fixe -- Ce message a été posté via la plateforme Web club-Internet.fr This message has been posted by the Web platform club-Internet.fr
http://forums.club-internet.fr/
Jean-Claude
Je ne vois pas du tout ce que tu pourrais faire désolé Jean-Claude -- Ce message a été posté via la plateforme Web club-Internet.fr This message has been posted by the Web platform club-Internet.fr
http://forums.club-internet.fr/
Je ne vois pas du tout ce que tu pourrais faire
désolé
Jean-Claude
--
Ce message a été posté via la plateforme Web club-Internet.fr
This message has been posted by the Web platform club-Internet.fr
Je ne vois pas du tout ce que tu pourrais faire désolé Jean-Claude -- Ce message a été posté via la plateforme Web club-Internet.fr This message has been posted by the Web platform club-Internet.fr
http://forums.club-internet.fr/
Nicolas Repiquet
"Yohann" a écrit dans le message news:
[snip]
Oups, excuses moi, j'avais raté ta réponse. Ben je suis désolé, dans ce cas je ne vois pas ce qui cloche. Tu as un jdk bien à jour etc ?
-- Nicolas Repiquet
"Yohann" <d@p.com> a écrit dans le message news:
2003921-195751-613747@foorum.com...
[snip]
Oups, excuses moi, j'avais raté ta réponse. Ben je suis désolé, dans ce cas
je ne vois pas ce qui cloche. Tu as un jdk bien à jour etc ?