Swing drawImage() lent animation java
Résolu/Fermé
A voir également:
- Drawimage java
- Waptrick java football - Télécharger - Jeux vidéo
- Jeux java itel football - Télécharger - Jeux vidéo
- Java apk - Télécharger - Langages
- Eclipse java - Télécharger - Langages
- Java runtime environment - Télécharger - Langages
1 réponse
KX
Messages postés
16760
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 février 2025
3 020
9 févr. 2018 à 14:05
9 févr. 2018 à 14:05
Bonjour,
Il y aurait pas mal de choses à revoir dans ton code, mais en testant chez moi ça ne saccade pas, donc peu importe les modifications que je pourrais faire, ce sera à l'aveugle, sans savoir si c'est mieux ou pire.
Bref, en Swing il ne faut pas faire de Thread, mais plutôt des SwingUtilities.invokeLater() et/ou des SwingWorker (inutile dans ton cas).
De plus au lieu de faire des boucles while avec des Thread.sleep, il vaut mieux utiliser un Scheduler.
Quand à ton int x, puisqu'il peut-être modifié par plusieurs Thread, un AtomicInteger serait pertinent.
Enfin, il n'y a aucune raison de manipuler un JPanel ici, un Container suffirait.
Exemple :
Il y aurait pas mal de choses à revoir dans ton code, mais en testant chez moi ça ne saccade pas, donc peu importe les modifications que je pourrais faire, ce sera à l'aveugle, sans savoir si c'est mieux ou pire.
Bref, en Swing il ne faut pas faire de Thread, mais plutôt des SwingUtilities.invokeLater() et/ou des SwingWorker (inutile dans ton cas).
De plus au lieu de faire des boucles while avec des Thread.sleep, il vaut mieux utiliser un Scheduler.
Quand à ton int x, puisqu'il peut-être modifié par plusieurs Thread, un AtomicInteger serait pertinent.
Enfin, il n'y a aucune raison de manipuler un JPanel ici, un Container suffirait.
Exemple :
import java.awt.Container; import java.awt.Dimension; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import javax.imageio.ImageIO; import javax.swing.JFrame; import javax.swing.SwingUtilities; class DynamicBackgroundContainer extends Container { private static final long serialVersionUID = 1L; private final AtomicInteger x; private final BufferedImage img; public DynamicBackgroundContainer(BufferedImage img, long period) { this.img = img; x = new AtomicInteger(0); ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); scheduler.scheduleAtFixedRate(this::scheduledMove, 0, period, TimeUnit.MILLISECONDS); } private void scheduledMove() { x.decrementAndGet(); SwingUtilities.invokeLater(this::repaint); } @Override public void paint(Graphics g) { g.drawImage(img, x.get(), 0, img.getWidth(), this.getHeight(), null); } } public class MoveBack extends JFrame { private static final long serialVersionUID = 1L; public MoveBack() throws IOException { setTitle("Test"); // titre de la fenetre setSize(900, 700); // taille quand elle s'ouvre setMinimumSize(new Dimension(700, 500)); // setResizable(true); // peut etre redimensionnée setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // fin processus fenetre quand "x" appuyer BufferedImage img = ImageIO.read(new File("background.png")); setContentPane(new DynamicBackgroundContainer(img, 10)); setVisible(true); // rend la fenetre visible } public static void main(String[] args) throws IOException { new MoveBack(); } }
9 févr. 2018 à 14:21
C'est très étrange quand même car j'ai l'impression que mon pc à des problèmes de lag avec java (particulierement swing j'ai l'impression), deja sur un autre projet j'avais ce type de problème alors qu'en faisant les test sur d'autres pc (dont certains moins puissant) cela marchait toujours parfaitement.. pourtant j'ai une install classique du JDK 1.8 sur unbuntu 17.10 (HP) , je vais essayer de voir si certains on ce type de problèmes...
9 févr. 2018 à 16:55
Toolkit.getDefaultToolkit().sync();
ça résous totalement le problème et c'est fluide du coup,
source : https://stackoverflow.com/questions/33257540/java-window-lagging-on-ubuntu-but-not-windows-when-code-isnt-lagging
Merci à toi en tout cas !