2010-03-26 9 views
3

je fais une simple grille qui chaque carré est mis en évidence par le curseur: alt text http://img168.imageshack.us/img168/203/screenshottest.pngJava repeindre est lent dans certaines conditions

Ils sont quelques JPanels, mapgrid et la superposition dans un JLayeredPane, avec mapgrid sur la bas. Mapgrid tire juste à l'initialisation du réseau, sa peinture metodh est:

public void paintComponent(Graphics g) { 

    super.paintComponent(g); 
    Graphics2D g2d = (Graphics2D) g; 
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
      RenderingHints.VALUE_ANTIALIAS_ON); 

for (int i = 0; i < h; i++) { 
     for (int j = 0; j < w; j++) { 
      g2d.setColor(new Color(128, 128, 128, 255)); 
      g2d.drawRect(tileSize * j, i * tileSize, tileSize, tileSize); 

     } 
    } 

Dans la superposition JPanel est l'endroit où la mise en évidence se produit, voici ce qui est repeint lorsque la souris est déplacée:

public void paintComponent(Graphics g) { 

    super.paintComponent(g); 
    Graphics2D g2d = (Graphics2D) g; 
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
      RenderingHints.VALUE_ANTIALIAS_ON); 


    g2d.setColor(new Color(255, 255, 128, 255)); 
    g2d.drawRect((pointerX/tileSize)*tileSize,(pointerY/ tileSize)*tileSize, tileSize, tileSize); 

} 

J'ai remarqué que même si la couche de base (mapgrid) n'est PAS repeinte lorsque la souris se déplace, juste la couche de recouvrement transparente, la performance fait défaut. Si je donne à l'overlay JPanel un fond, c'est plus rapide. Si je supprime l'anti-crénelage mapgrid, c'est un peu plus rapide aussi. Je ne sais pas pourquoi donner un fond à la couche de superposition (et ainsi, cacher la mapgrid) ou désactiver l'antialiasing dans la mapgrid conduit à de meilleures performances.

Y a-t-il une meilleure façon de procéder? Pourquoi cela arrive-t-il?

Répondre

2

Au lieu de drawRect, vous pouvez drawLine. Vous devriez obtenir le même résultat visuel mais je pense que ce sera beaucoup plus rapide.

De même, si l'arrière-plan est toujours le même, je recommande de dessiner sur une image mise en mémoire tampon lors de l'initialisation (ou lorsque le cadre est redimensionné), puis de dessiner cette image. Cela devrait accélérer le dessin.

+0

Pourquoi devrais-je changer la façon dont je dessine la grille? La couche inférieure est repeinte même si je n'ai pas spécifié de le faire? –

+1

@Gabriel Toute la fenêtre est mise en mémoire tampon. Si vous en repeignez une partie, tout ce qui contribue à cette section devra être repeint. Il n'y a pas de mise en mémoire tampon par composant (par défaut). –

1

Si tout votre Mapgrid est de la même couleur, retirez la setColor de la boucle. En ce moment, chaque appel à peindre crée w * h nouveaux objets Couleur.

1

je remarquai que même si la couche de base (de mapgrid) est pas repeint lorsque la souris se déplace, juste la couche de recouvrement transparente, la performance est manque.

Cela n'a aucun sens pour moi. Puisque votre panneau d'incrustation ne fait qu'un drawRect (...) pour la grille que la souris est actuellement terminée, comment la grille précédente est-elle réinitialisée? Je suppose que lorsque vous repeignez votre panneau de superposition, il n'est pas opaque, à la mapgrid devrait repeindre toute la grille avant de redessiner la grille sur votre panneau de superposition.

Existe-t-il une meilleure façon de procéder?

Gardez une trace de la dernière grille peinte. Ensuite, vous pouvez invoquer repeindre (Rectangle) pour ne repeindre que cette grille sur le panneau de la grille de la carte. Ensuite, vous pouvez également appeler Repaint (Rectangle) sur votre panneau de superposition pour redessiner la grille sur le panneau de superposition.

Si vous avez besoin de plus d'aide poster votre SSCCE qui démontre le problème.

Questions connexes