Bonjour,
je réalise un programme qui utilise le chargement aléatoire d'images d'une bibliothèque. Je présente ici une version type diaporama. Les chargements se succèdent dans le même conteneur PImage. Progressivement la mémoire disponible se sature : les images précédentes ne sont donc pas supprimées de la mémoire.
Nouveau sur Processing (je viens d'AS2) j'ai choisi de de m'investir tout de suite sur les versions les plus récentes 2.0b6-7.
Y a-t-il un bug sur la mémoire, est-ce que je procède mal?
Je précise que même si cela peut sembler beaucoup d'images chargées quand même, le principe de mon programme est de pouvoir tourner "indéfiniment" et que je ne souhaite disposer en mémoire que d'1 ou 2 images simultanément.
merci de vos conseils
Hors ligne
dans les options tu as une fonction "increase maximum memory" tu peux mettre le montant que tu veux
Hors ligne
Oui, j'ai essayé "increase maximum memory" : cela permet de retarder le phénomène de "bourrage mémoire" mais pas de le supprimer (or mon projet étant de faire une sorte de programme perpétuel cela est bien gênant).
Petite atténuation : dans la dernière version complète de mon programme j'ai changé les dimensions de la fenêtre et le phénomène est moindre. Comme la différence joue sur le redimensionnement 'resize' des images chargées c'est peut-être ce 'resize' qui pose problème...
Hors ligne
Salut,
je me dis que tu devrais essayer avec le multi-threading ?
http://wiki.processing.org/w/Threading
Hors ligne
Salut,
Si je comprends bien ton code, tu charges une image par seconde avec Sc=new Img() dans la boucle draw, mais en faisant ça, tu crées un nouvel objet à chaque fois, c'est probablement pour ça que la mémoire s'encombre, les objets ne sont pas détruits?
Tu pourrais créer un tableau de 3 objets, charger 3 images, en afficher une puis l'autre, etc, tout en rechargeant de nouvelles images dans ceux qui ne sont pas affichés.
Deux trucs qui peuvent t'intéresser :
http://wiki.processing.org/w/Asynchrono … ge_loading
http://processing.org/reference/requestImage_.html
Hors ligne
Merci oyster_twiter, je vais me plonger un peu plus sur ce "threading", cela semble intéressant (je ne suis pas sûr d'avoir bien compris encore) pour avoir des actions indépendantes du rythme de draw() et ça m'intéresse aussi, mais pour l'instant je ne vois pas en quoi cela interviendrait sur ce problème de mémoire...
Hors ligne
Salut Emoc,
cela crée effectivement un nouvel objet PImage enfant de mon objet Sc = Sc.pict ; mais justement le nouvel objet image Sc.pict ne remplace-t-il pas le précédent ne serait-ce que par l'action new Img() ?
J'ai déjà essayé une autre version où je ne repasse pas par new Img() j'effectue directement : pict=loadImage(nomImg); (et même en effectuant removeCache(pict) auparavant car il n'existe pas de clear() pour cet objet, en vérifiant pict devient alors "null") :
cela ne change rien.
Se peut-il que la mémoire conserve en dissociant du nom d'objet la version pict n°1, n°2 etc...?
Je ne comprends pas...
Hors ligne
chrisjo a écrit:
le nouvel objet image Sc.pict ne remplace-t-il pas le précédent ne serait-ce que par l'action new Img() .
Ah oui, tu as raison, ça parait logique que de recréer une nouvelle instance de l'objet efface l'ancienne. Mais, je ne sais pas exactement comment fonctionnent les mécanismes de destruction d'objet en java, en théorie c'est le «garbage collector» qui s'en charge, mais pour les objets descendants d'objets... Peut-être que c'est lié à la gestion de la mémoire de processing avec loadImage? Je crois que j'ai atteint ma limite
Le code source de la fonction loadImage est ici, à partir de la ligne 5378 : http://code.google.com/p/processing/sou … pplet.java
Hors ligne
citation :
emoc a écrit :
en théorie c'est le «garbage collector» qui s'en charge, mais pour les objets descendants d'objets...
J'ai également essayé de mettre mon objet "pict" PImage en variable globale (hors la classe) et le résultat reste le même...
Merci pour le lien... cela fait un peu beaucoup de code à comprendre : on y voit quand même qu' "ils" créent des objets images-java intermédiaires locaux et donc si le «garbage collector» ne supprime pas ces objets... cela peut s'entasser de la même façon que dans mon programme.
Cependant je retrouve ici "removeCache()" : je l'avais déjà inclus récemment en effectuant :
removeCache(pict);
avant le rechargement d'une nouvelle image
mais j'avais oublié un objet PGraphics que j'utilise de la même façon, je lui ai appliqué :
removeCache(obj_PGraphics);
de la même façon et cette fois cela marche !!!!
La mémoire utilisée monte puis se stabilise, redescend même en fonction du poids de l'image (plusieurs vérifs avec et sans me confirment sur la différence de comportement). Reste à voir sur une journée ou plus... puisque c'est mon but.
A noter l'info sur cette page :
Advanced users please note that createImage() should be used instead of
* the syntax new PImage() .
Dans le guide de référence il est même indiqué de ne pas utiliser new PImage().
Je confirmerai sur une grande durée,
merci à ceux qui se sont intéressés au PB !
Hors ligne
En conclusion : après un fonctionnement pendant 3 jours ininterrompus, il n'y a plus de problème mémoire avec l'introduction de removeCache() c'est donc la solution!
Difficile de comprendre comment un nouvel loadImage() répétitif sur un même objet ne libère pas à chaque fois la place mémoire du chargement précédent mais c'est ainsi...
Hors ligne
Bonjour chrisjo,
Super que tu ai trouvé la solution.
C'est vrai que c'est curieux que loadImage() ne fasse pas ça d'emblée...
Peut-être tu peux signaler ça comme une 'issue' sur le dépot du code de Processing ?
https://code.google.com/p/processing/issues/list
Hors ligne
Peut-être que ce serait bien de le signaler, en effet, mais mon anglais est un peu hésitant, j'ai peur d'être incompréhensible...
Hors ligne
je crois que ça s'appelle une fuite de cache ou de ram, c'est le soft qui libère pas la ram qu'il utilise
En anglais, ils disent "memory leak"
Bon petite recherche dans leur issue : http://code.google.com/p/processing/iss … %20Summary
Hors ligne
citation :
Cgiles a écrit :
Bon petite recherche dans leur issue : http://code.google.com/p/processing/iss … %20Summary
donc, ce problème est déjà signalé et la même solution que la mienne est proposée en attendant que le bug soit réglé, très bien.
Hors ligne
je pense qu'il faut que tu le signales en donnnant le numero de version et la machine/os que tu utilises, en commentant a la suite du report
Hors ligne
Pages: 1 2