Graphique.drawImage () en Java est extrêmement lent sur certains ordinateurs mais beaucoup plus rapide sur d'autres

j'ai un problème étrange, essentiellement en Java Graphiques.drawImage () est extrêmement lent sur certains ordinateurs et plus rapide sur d'autres. Ce n'est pas lié à la puissance des ordinateurs non plus, certains ordinateurs plus faibles fonctionnent très bien tandis que d'autres plus forts semblent s'étouffer à l'appel de drawImage.

Il peut ou peut ne pas être liée à la largeur et la hauteur, j'ai une très, très grande largeur et la hauteur définie (quelque chose comme 5000 par 2500). Je ne pense pas que ce soit le problème sauf comme je l'ai dit, il fonctionne en temps réel sur certains ordinateurs et plus lent sur d'autres et ne semble pas être liée à la puissance relative des ordinateurs.

les deux ordinateurs ont la même version de Java, les deux utilisent Vista. L'un est doté d'un Core 2 Duo de 1,83 ghz avec une RAM de 1 Go et des graphismes embarqués (tout fonctionne très bien), l'autre a un core 2 duo de 2,53 ghz avec un 9600GS (les derniers pilotes nVidia) et 4 Go de RAM et il se branche littéralement sur l'appel de drawImage.

des idées?

edit: ok c'est vraiment bizarre, Je dessine l'image à une fenêtre en oscillation, maintenant quand je redimensionne la fenêtre et la rendre vraiment petite l'image est réduite aussi et il devient petit. Tout à coup tout se passe bien, quand je le redimensionne à la taille qu'il était avant qu'il ne fonctionne encore en douceur!

il a aussi plusieurs problèmes de moniteur, si je fais le tour de redimensionner pour le faire courir plus vite sur un moniteur puis le faire défiler vers un autre moniteur quand plus de la moitié de la fenêtre est dans le nouveau moniteur il commence à se brancher encore. J'ai pour redimensionner la fenêtre à petit, puis de revenir à sa taille d'origine pour reprendre de la vitesse.

si je fais l'astuce de redimensionnement sur un moniteur, déplacez-le vers l'autre il bien sûr chugs, mais si je le renvoie à l'écran d'origine sur lequel j'ai fait l'astuce de redimensionnement il fonctionne à 100%

si j'ai deux fenêtres pivotantes ouvertes (affichant la même image) elles tournent toutes les deux lentement, mais si je fais le tour de redimensionner sur une fenêtre elles commencent toutes les deux à fonctionner en douceur (cependant ce n'est pas toujours le cas).

*quand je dis redimensionner la fenêtre, je veux dire la rendre aussi petite que possible au point de l'image ne peut pas être vu.

est-ce que cela pourrait être un bug dans Java peut-être?

15
demandé sur DJClayworth 2009-03-18 15:31:09

7 réponses

Performances d'écriture d'une image à l'écran est très affecté par le format dans lequel l'image est stockée. Si le format est le même que la mémoire de l'écran veut alors il peut être très rapide; s'il n'est pas alors une conversion doit être faite, parfois pixel par pixel, qui est très lent.

si vous avez un contrôle sur la façon dont l'image est stockée, vous devriez la stocker dans un format que l'écran Recherche. Voici un exemple de code:

    GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
    GraphicsDevice device = env.getDefaultScreenDevice();
    GraphicsConfiguration config = device.getDefaultConfiguration();
    BufferedImage buffy = config.createCompatibleImage(width, height, Transparency.TRANSLUCENT);
    Graphics g = buffy.getGraphics();

Si vous allez à dessinez l'image plusieurs fois qu'il peut être utile de convertir à un format compatible, même si elle est venue dans un autre format.

dessiner une image sera aussi plus lent si vous la transformez comme vous dessinez, ce que la partie "redimensionner" de votre description me fait penser que vous pourriez être. Encore une fois, faites le redimensionnement une fois (lorsque la fenêtre est redimensionnée) et mettez en cache l'image redimensionnée et compatible afin qu'elle puisse être redessinée rapidement.

23
répondu DJClayworth 2017-03-02 22:18:11

si vous utilisez Java de sun, essayez certaines des propriétés suivantes du système, soit comme paramètres de ligne de commande, soit comme les premières lignes dans main

sun.java2d.opengl=true  //force ogl  
sun.java2d.ddscale=true //only when using direct3d  
sun.java2d.translaccel=true //only when using direct3d  

vous pouvez voir plus de drapeaux à cette page

Regardez sun.java2d.trace qui peut vous permettre de déterminer la source de la performance graphique moins que souhaitable.

4
répondu KitsuneYMG 2011-02-28 16:17:49

il y a plusieurs choses qui pourraient influencer la performance ici:

  • RAM disponible
  • vitesse CPU
  • carte graphique (embarquée ou séparée)
  • pilote Graphique
  • version Java
  • mode vidéo utilisé (résolution, bitdepth, prise en charge de l'accélération)

modifier: En regardant la question éditée, je propose de vérifier si le système 9600GS a les pilotes NVidia les plus récents installés. J'ai récemment installé un pilote pour une carte graphique Intel embarquée qui a remplacé le pilote Windows générique et a fait bouger les fenêtres, regarder des vidéos, naviguer, etc. beaucoup plus rapide.

Toutes les autres caractéristiques semblent bonnes. Peut-être que Java ne détecte pas les 9600G et n'utilise pas l'accélération matérielle, mais j'en doute.

vérifiez également la configuration du système D'exploitation. Sous Windows, vous pouvez désactiver l'accélération matérielle à des fins de débogage.

bien sûr, la meilleure façon de gérer ce qui serait à changer votre code-redimensionnez l'image ou divisez-la en morceaux comme DNS l'a proposé. Vous ne pourrez jamais voir toute l'image telle qu'elle est à l'écran.

2
répondu schnaader 2009-03-18 13:02:34

Comment jugez-vous la puissance des ordinateurs? Une image de 32 bits de 50x25 K prend plus de 4,5 Go de mémoire vive pour être conservée en mémoire (50000 * 25000 * 4 bytes). Si un ordinateur a plus de RAM qu'un autre, cela peut faire une énorme différence de vitesse, parce qu'il n'aura pas à changer de disque aussi souvent. Vous devriez envisager de saisir des sous-sections de l'image et de travailler avec ceux-ci, au lieu de l'ensemble.

Edit: utilisez-vous les derniers pilotes Java & graphics? Si votre image est seulement 5Kx2.5K, le la seule chose à laquelle je pense, c'est qu'il le fait sans aucune accélération matérielle.

2
répondu DNS 2009-03-18 13:20:18

Vérifiez les paramètres de l'écran. Mon pari est que la profondeur de pixel est différente sur les deux systèmes, et que le lent a une profondeur de pixel étrange liée à l'objet d'image que vous essayez d'afficher.

1
répondu Thorbjørn Ravn Andersen 2009-03-18 12:59:39

Depuis Java utilise OpenGL pour faire le dessin 2D, les performances de votre application sera affectée par les performances OpenGL de la puce graphique de l'ordinateur. La prise en charge D'OpenGL diminue dans l'industrie 3D, ce qui signifie que (ironiquement) les nouvelles puces peuvent être plus lentes au rendu D'OpenGL que les anciennes - non seulement en raison du matériel, mais aussi des pilotes.

0
répondu Ian Kemp 2009-03-18 13:02:40

avez-vous essayé le Mode plein écran exclusif?

cela pourrait aider: http://download.oracle.com/javase/tutorial/extra/fullscreen/index.html

0
répondu lasantha 2011-02-16 21:57:36