Bonjour à tous,
Je développe un Applet dans lequel je vais chercher des images sur une url spécifique pour les afficher.
Or je veux garder afficher une image tant que la suivante n'est pas disponible.
J'ai jusqu'alors utilisé ImageIcon qui semble il intègre Mediatracker :
Cette solution est fonctionnelle mais consomme énormément de mémoire. Sur mon poste java.exe monte jusqu'à 290mo de mémoire avant de se stabiliser (j'affiche jusqu'à 20img/s).
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 public void run { while(threadPlayer!=null && this.stopLecture == false) { if(this.imageloaded) { this.imageloaded = false; this.getUrlImage(); ImageIcon img = new ImageIcon(this.UrlImage); this.imgFromUrl = img.getImage(); if(img.getImageLoadStatus() == MediaTracker.COMPLETE) this.repaint(); this.imgFromUrl.flush(); img = null; try{Thread.sleep(this.fps);}catch (InterruptedException e){} } else { //Sleep 50ms } } }
Après quelques recherches j'ai tester ImageIO accouplé à Media tracker :
Cette fois la consommation mémoire chute pour tourner autour de 50Mo.
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 while(threadPlayer!=null && this.stopLecture == false) { if(this.imageloaded) { this.imageloaded = false; this.getUrlImage(); try{ this.imgFromUrl = ImageIO.read(this.UrlImage); } catch(IOException e){} //Tracker instancié dans init() try{ this.tracker.addImage(imgFromUrl, 1); this.tracker.waitForID(1); } catch(InterruptedException e){} if(this.tracker.statusID(1, false) == MediaTracker.COMPLETE) this.repaint(); this.tracker.removeImage(imgFromUrl); this.imgFromUrl.flush(); try{Thread.sleep(40);}catch (InterruptedException e){} } else { //Do something else } }
Du coup je m'interroge, le fonctionnement final semblant être le même d'ou vient cette différence de mémoire ? ImageIO.read utilise t'il bien mon MediaTracker ou passe t'il outre ?
Deplus si à la place de ImageIO.read() j'utilise simplement Java.applet.Applet.getImage() j'ai le droit à un outofmemory.
Quel solution dois je utiliser ?
Partager