IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AWT/Swing Java Discussion :

Problèmes performances JPanel rafraichissement images


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 7
    Par défaut Problèmes performances JPanel rafraichissement images
    Bonjour,
    je rencontre un problème génant de performances de l'affichage sur un début d'application graphique.
    La fenêtre principale est composée d'un JPanel et d'un JSlider, le but étant d'afficher une image dans le JPanel pour chaque "cran" du JSlider.
    Je possère un répertoire contenant une 40aine d'images (en bmp ou png), la taille du JSlider est donc bien sûr adaptée au nombre d'images du répertoire.

    J'ai défini une classe JPanelImage qui étend JPanel et qui possède une méthode paint(Graphics) qui va bien pour afficher l'image adaptée à la taille du JPanel.
    Cette classe possède aussi une méthode setImage(Image) pour changer l'image en fonction du cran du slider.

    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
     
    public class JPanelImage extends JPanel {
        Image image; 
     
        public JPanelImage() {
            this.image = null;
        }
     
        public void setImage(Image image){
        	this.image = image;
        	this.repaint();
        }
     
        public void paint( Graphics g ) {
               super.paintComponent(g);
               g.drawImage(image, 0, 0, this.getWidth(), this.getHeight(), null);
       }
     
    }
    Je charge toutes les images en mémoire dans un ArrayList à la création de la fenêtre principale grâce à la méthode ImageIO.read(file), puis en fonction du cran du slider choisi, j'affiche telle ou telle image (ex: panelImage.setImage(images.get(slider.getValue())); )

    Avec des bmp, le rafraichissement du panel est fluide (utilisation processeur ~15%) mais avec des png c'est la catastrophe, le slider "rame" et le processeur s'affole (~50% d'utilisation processeur et c'est un dual core...).

    Auriez-vous des idées pour améliorer significativement les performances ?
    Je précise que j'ai essayé la méthode Toolkit.getDefaultToolkit().getImage(image), mais elle ne gère pas les bmp et l'affichage des png est fluide mais l'image n'est pas chargée directement (surement à cause du fait que getImage(image) charge l'image en arrière-plan ?).

    Merci d'avance pour votre aide.

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Puisque tu précharges tes images, il n'y a plus de différence entre une source bmp ou png.
    Es-tu sûr, dans ton code, que toutes tes images sont chargées au démarrage de l'appli ? Ou alors ne seraient-elles pas chargées au fur et à mesure du changement de ta scrollbar ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  3. #3
    Membre expérimenté
    Profil pro
    Dev NodeJS
    Inscrit en
    Août 2006
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev NodeJS

    Informations forums :
    Inscription : Août 2006
    Messages : 177
    Par défaut
    Citation Envoyé par Mr.Cow Voir le message
    Bonjour,
    je rencontre un problème génant de performances de l'affichage sur un début d'application graphique.
    La fenêtre principale est composée d'un JPanel et d'un JSlider, le but étant d'afficher une image dans le JPanel pour chaque "cran" du JSlider.
    Je possère un répertoire contenant une 40aine d'images (en bmp ou png), la taille du JSlider est donc bien sûr adaptée au nombre d'images du répertoire.

    J'ai défini une classe JPanelImage qui étend JPanel et qui possède une méthode paint(Graphics) qui va bien pour afficher l'image adaptée à la taille du JPanel.
    Cette classe possède aussi une méthode setImage(Image) pour changer l'image en fonction du cran du slider.

    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
     
    public class JPanelImage extends JPanel {
        Image image; 
     
        public JPanelImage() {
            this.image = null;
        }
     
        public void setImage(Image image){
        	this.image = image;
        	this.repaint();
        }
     
        public void paint( Graphics g ) {
               super.paintComponent(g);
               g.drawImage(image, 0, 0, this.getWidth(), this.getHeight(), null);
       }
     
    }
    Je charge toutes les images en mémoire dans un ArrayList à la création de la fenêtre principale grâce à la méthode ImageIO.read(file), puis en fonction du cran du slider choisi, j'affiche telle ou telle image (ex: panelImage.setImage(images.get(slider.getValue())); )

    Avec des bmp, le rafraichissement du panel est fluide (utilisation processeur ~15%) mais avec des png c'est la catastrophe, le slider "rame" et le processeur s'affole (~50% d'utilisation processeur et c'est un dual core...).

    Auriez-vous des idées pour améliorer significativement les performances ?
    Je précise que j'ai essayé la méthode Toolkit.getDefaultToolkit().getImage(image), mais elle ne gère pas les bmp et l'affichage des png est fluide mais l'image n'est pas chargée directement (surement à cause du fait que getImage(image) charge l'image en arrière-plan ?).

    Merci d'avance pour votre aide.
    Il faut redéfinir la méthode paintComponent et non paint pour améliorer les perfs.

    En plus la tu appelles paintComponent depuis paint c'est bizarre...

  4. #4
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    http://www.developpez.net/forums/sho...69&postcount=2

    Il faut bien préférer paintComponent à paint mais pas pour des raison de perfs, en effet la méthode paint dans Swing a pour but d'appeler un certain nombre de méthodes dont paintComponent mais pas uniquement, redéfinir la méthode paint peut s'avérer un poil problématique car tu peux empêcher plus que le dessin du composant en lui même.

  5. #5
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 908
    Billets dans le blog
    54
    Par défaut
    C'est a dire le dessin de ses sous-composants et de sa bordure. paintComponent() est donc la voie a choisir.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 7
    Par défaut
    Merci beaucoup pour vos réponses, ça marche parfaitement maintenant, avec une utilisation du processeur minime et plus aucun ralentissement que ça soit avec des bmp ou des png !

    J'ai utilisé la méthode de sinok pour rendre les images compatibles avec la carte graphique et j'ai changé le paint() en paintComponent().


+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 12/03/2007, 17h51
  2. Réponses: 13
    Dernier message: 23/12/2004, 18h01
  3. [débutant] problème de lecture d'image
    Par shura dans le forum OpenGL
    Réponses: 16
    Dernier message: 03/07/2004, 18h05
  4. Problème de nb d'images par seconde
    Par Francky033 dans le forum DirectX
    Réponses: 7
    Dernier message: 17/04/2004, 10h37
  5. Problème de mémoire Affichage images
    Par Repti dans le forum C++Builder
    Réponses: 6
    Dernier message: 29/03/2004, 20h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo