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 :

Lenteur d'affichage si accélération matérielle activée


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 14
    Par défaut Lenteur d'affichage si accélération matérielle activée
    Bonjour,

    J'ai une applet java qui affiche une carte numérisée et sur laquelle je peux effectuer de simples actions de sélection de foyers. Cette applet n'a pour le moment pas posé de problème chez aucun client jusqu'à il y a quelques temps. J'ai eu depuis plusieurs retours de client (j'ai eu le problème chez moi également) qui se plaignaient d'une lenteur d'affichage. En effet le remplissage d'un cercle peut prendre 15 secondes (on voit le cercle se remplir ligne par ligne).

    J'ai trouvé la cause de mon problème et le simple fait de désactiver l'accélération matérielle de ma carte graphique permet de résoudre le problème. En fait j'ai juste besoin de désactiver "les accélérations DirectDraw et Direct3D, et celles des curseurs et des tracés avancés. Utilisez ce réglages pour régler les problèmes liées aux applications accélérées par DirectX"

    Pour info j'ai la jre 1.6.0_12 et j'utilise la lib awt pour l'affichage, voici pour exemple une des méthodes d'affichage utilisées (le cercle qui met 15 secondes à se remplir) :

    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
     
    public void drawObject(Graphics g) {
            if(radius >= 0) {
                g.setXORMode(color_xor);
     
                int x = (int) host.mapToScreenX(xc) - radius ;
                int y = (int) host.mapToScreenY(yc) - radius ;
     
                g.setColor(color_poly);
                g.fillOval(x, y, 2*radius, 2*radius) ;
     
                g.setColor(color_line);
                g.drawOval(x, y, 2*radius, 2*radius) ;
            }
        }
    Quelqun a une idée de la cause exacte de ce problème et que puis-je faire pour ne pas avoir à imposer aux client de désactiver leur accélération matérielle ?

    Merci pour votre aide ...

  2. #2
    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
    La cause exacte de ton problème est l'utilisation du mode XOR qui ne se marie pas bien avec l'accélération matérielle, car Direct3D ne supporte pas ce mode, donc java retombe sur une implémentation software bien lente. Il faudrait que tu regardes si l'un des modes de compositing de java ne te fournis pas une alternative viable

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 14
    Par défaut
    Merci à toi Sinok, je vais jeter un œil pour trouver un équivalent au mode xor dans l'après midi ... je te tiens au courant dès que j'ai testé

  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
    Tu trouveras un minimum d'infos sur les modes de compositing fournis par java ici

    Il se pourrait même qu'il te suffise de passer par l'AlphaComposite Xor au lieu du mode XOR (à vérifier tout de même)

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 14
    Par défaut
    Bon, il n'a pas été simple d'effectuer mes tests car je viens juste de changer de machine de dev, et mon SIG (Système d'informations géographique) n'était plus opérationnel ... bref voilà ou j'en suis :

    Pour en avoir le cœur net j'ai essayé de désactiver l'utilisation de Direct3D, en mettant à jour les propriétés système à l'initialisation de l'applet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    System.setProperty("sun.java2d.d3d", "false");
    System.setProperty("sun.java2d.ddoffscreen", "false");
    System.setProperty("sun.java2d.noddraw", "false");
    bien sûr cela n'a pas fonctionné (Ce qui parait normal, il faudrait que ces paramètres soient appliqués avant le lancement de la jvm ...)

    J'ai ensuite testé ta solution de remplacement avec l'AlphaComposite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    //g.setXORMode(color_xor);
    ((Graphics2D)g).setComposite(AlphaComposite.getInstance(AlphaComposite.XOR, 0.3f));
    et là, effectivement ça ne rame plus, mais l'effet est tout autre, je n'ai aucune transparence mais un disque noir opaque ... (même en mettant un alpha < 1 comme dans l'exemple ci-dessus)

    Je poursuis les tests demain, merci a toi Sinok en tout cas ! Enfin si quelqun peut me dire ou je me plante avec l'AlphaComposite je lui en serai très reconnaissant !

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 14
    Par défaut
    Bon, je n'ai pas réussi à effectuer l'équivalent de mon XORMode avec l'AlphaComposite Xor, je vais donc m'orienter vers une solution type repaint avec conservation du contexte graphique ... Pour les personnes qui auraient le même problème que moi, il vous est possible d'utiliser le workaround proposé par sun (ajouter le paramètre d'exécution : -Dsun.java2d.d3d=false). Toutefois si quelqu'un a une meilleure solution je suis très intéressé !
    A+

Discussions similaires

  1. Réponses: 3
    Dernier message: 24/10/2011, 15h23
  2. Activer l'accélération matériel
    Par vg-matrix dans le forum Windows XP
    Réponses: 1
    Dernier message: 25/08/2008, 02h44
  3. Réponses: 13
    Dernier message: 08/11/2006, 11h36
  4. Plantage accélération matérielle
    Par Azharis dans le forum Composants
    Réponses: 2
    Dernier message: 31/05/2006, 20h45
  5. lenteur d'affichage de requete dans un DBGrid
    Par nico27 dans le forum InterBase
    Réponses: 9
    Dernier message: 23/06/2003, 13h54

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