2016-02-04 1 views
0

J'ai besoin de mon fil principal pour bloquer un spécifique temps. Je travaille actuellement sur un jeu 2D et c'est assez laggy juste parce que le Thread.sleep (2) dort pendant ~ 17 secondes et quand vous déplacez le personnage, les graphiques sont légèrement en retard. Parfois, cela fonctionne très bien (quand j'ai couru l'application environ 10 fois) et parfois ce n'est pas le cas. Je sais qu'il y a un délai sur la méthode Thread.sleep (long millisecondes) mais est-il possible de l'éviter ou une alternative? J'ai déjà essayé LockSupport.parkNanos ((long) 2e6) mais cela n'a rien changé.Java - Comment bloquer un thread en cours d'exécution pour une durée exacte?

+1

Lorsque vous utilisez 'sleep' dans une boucle sur les fenêtres , vous devez toujours planifier un autre thread sur le fond qui dort pour toujours, sinon votre sommeil est inacceptable. – Ferrybig

+2

Thread.sleep (2) dort pendant ~ 17 secondes? Il y a une énorme inexactitude ici, mais je ne suis pas sûr de blâmer l'ordinateur ou la personne qui l'utilise. – Kayaman

+3

@Ferrybig Pourriez-vous fournir une citation ou un raisonnement expliquant pourquoi le planificateur de threads Windows est affecté par un thread d'arrière-plan qui dort toujours de cette façon? – hexafraction

Répondre

0

Vous mentionnez des graphiques, donc je suppose que vous utilisez soit Swing de JavaFX. Il est généralement une mauvaise idée de bloquer un thread d'interface utilisateur, car il doit faire beaucoup de travail, il abstraits pour vous. Si vous utilisez Swing, regardez java.swing.Timer. Et assurez-vous que vous courez dans le event dispatch thread (EDT), pendant que vous y êtes :-).

+0

Eh bien, la solution de Ferrybig a fait l'affaire pour moi, donc je suppose que je m'en tiendrai à celle-là. Je n'utilise pas Swing ou JavaFX Je suis en train de programmer avec awt. Oui, je sais que ce n'est pas recommandé mais ça va, je n'ai pas eu de sérieux problèmes ... pour le moment. – user263980

0

Si vous voulez que votre jeu soit réactif, vous devez déléguer la logique et le rendu graphique à différents threads. Tout exécuter dans un thread rend cette application hautement imprévisible en ce qui concerne le calcul de l'effet Thread.Sleep().

Veuillez également spécifier ce que vous utilisez, AWT, Swing, JavaFX? Si vous utilisez AWT, il pourrait y avoir de sérieux problèmes avec le rendu des animations fluides. Je suggère de commencer avec Swing même pour des jeux/animations très basiques.

En ce qui concerne l'exécution des fils est mon préféré:

  1. Création d'une nouvelle classe qui implémente Runnable avec fileds privés Thread thread et boolean flag
  2. @Override Run() pour avoir quelque chose comme try { while(flag) { refresh(); Thread.sleep(10) } }
  3. En cette classe crée une méthode startRendering() qui définit flag=true et démarre le thread interne thread = new Thread(this).start()
  4. Créer stopRendering () Qui définit flag=false

Cela vous permet de démarrer et d'arrêter l'animation dans votre fil logique correctement et avec facilité (sans Thread.Abort() et autres)

+0

Merci pour tout l'effort. J'ai déjà implémenté votre idée un peu différemment et ça fonctionne maintenant. J'ai beaucoup travaillé avec Swing par le passé, mais je ne l'aime pas vraiment pour être honnête, c'est pourquoi j'utilise awt pour le moment. Je sais que c'est problématique mais je pense que je peux gérer cela, je ne suis pas un débutant;) – user263980

+0

Merci pour vos commentaires :) Bon d'entendre que vous avez résolu votre problème. – badsamaritan