2010-06-30 8 views
2

J'ai une interface utilisateur personnalisée dessinée pour mon application Java. En ce moment, je dessine toute l'interface utilisateur à partir de zéro. Je sais que certaines parties de l'interface utilisateur sont statiques. Je sais que je pourrais sauvegarder ces parties statiques sur une image, mais cela améliorera-t-il les performances (puisque même une image doit être dessinée à chaque image)?Optimisation des graphiques Java

Est-il plausible de sauvegarder une référence à l'objet Graphics2D après que l'interface utilisateur a été dessinée et de l'affecter au nouvel objet graphique à chaque image (à partir d'un point où tous les composants statiques sont dessinés)?

Merci à l'avance, Alan

+0

Je suis entièrement sûr, donc je ne donne pas cela comme une réponse. Je pense que vous pouvez juste remplacer la méthode paint() et ne dessiner que les éléments mis à jour, mais cela vous demandera de savoir ce qui doit être repeint tout le temps.Si vous voulez juste accélérer les choses. Peut-être jeter un oeil à ceci: http://java.sun.com/docs/books/tutorial/extra/fullscreen/doublebuf.html – Viele

+0

quand vous dites «je dessine l'interface utilisateur entière à partir de rien» où faites-vous cela? Avez-vous un seul composant JComponent personnalisé ou avez-vous un JFrame avec de nombreux composants personnalisés? – Justin

Répondre

1

Vous n'avez pas besoin de tout redessiner dans chaque image. Donc, si vous avez des parties statiques de votre interface utilisateur (ou même des parties dynamiques que vous connaissez n'ont pas changé depuis la dernière image) alors vous n'avez simplement pas besoin de les repeindre.

Dans mon code (jeux Swing et des simulations pour la plupart) J'essaie généralement de suivre les règles suivantes:

  1. images statiques pré-préparation (par exemple textures BufferedImage pour les éléments de l'interface utilisateur)
  2. Remplacer la paintComponent() N'appelez la méthode repaint() d'aucun élément d'IU donné si je sais que quelque chose a changé
  3. Appelez repaint() dans une boucle basée sur un minuteur pour l'animation, mais seulement appelez-le sur la partie de l'interface utilisateur t le chapeau est animé (par ex. une nichée JPanel)

Cette approche semble fonctionner et d'effectuer assez bien (bien que je serais heureux des commentaires s'il y a des façons de l'améliorer !!)

+0

Merci. Je pense que cela fonctionnera bien. – Alan

+0

3a. Avoir la méthode repaint vérifier un booléen sale qui est défini sur vrai lorsque le composant doit être repeint. Je pense que c'est ce que fait Swing pour accélérer le processus de repeint. –

1

si certaines parties de l'écran est complètement statique, jamais redessiner cette partie. Ne faites pas un plein écran/fenêtre effacer, juste effacer la partie de l'écran/fenêtre qui change tout le temps. De cette façon, vous ne redessinez pas inutilement l'image statique.

2

Il y a deux optimisations principales que vous pouvez faire ici. La première consiste à s'assurer que lorsque vous faites repeindre votre interface utilisateur, généralement en appelant repaint, veillez à appeler la version de repaint où vous spécifiez un rectangle qui a changé. Seulement rendre le rectangle assez grand pour englober les parties qui ont réellement changé, pas les parties statiques. Pour que ce soit efficace, vous devez également faire attention à la clipRect dans l'objet Graphics2D que vous avez passé dans paint(). Cela est utilisé par le système pour vous dire exactement ce qui doit être repeint, dans le cas ci-dessus habituellement le rectangle que vous avez passé à repeindre. Ne peignez rien qui se trouve entièrement à l'extérieur de ce rectangle.

Vous pouvez également obtenir des améliorations significatives des performances en mettant en cache les parties statiques de votre interface dans une image. Ecrire une image est de loin le moyen le plus rapide d'afficher les choses sur un écran. Mes mesures indiquent que les petites images sont plus rapides que même quelques primitives de dessin simples. Cependant, vous devez vous assurer que les caractéristiques de l'image correspondent à l'écran, en utilisant createCompatibleImage().

Bien sûr, vous utilisez peut-être beaucoup de mémoire pour obtenir cette accélération. Je recommanderais de tester si vous avez besoin de faire de la mise en cache d'image avant de l'implémenter.