Partage
  • Partager sur Facebook
  • Partager sur Twitter

Sleep sans thread ni timer

besoin d'idées

Sujet résolu
    21 septembre 2011 à 15:51:50

    Bonjour,

    quelqu'un saurait-il s'il y a un moyen de faire une pause sans utiliser ni de thread, ni de timer ?
    J'aimerai bien exécuter une action toutes les X ms

    Il faudrait je pense utiliser deux variables,
    - currentTime
    - actionFrequency
    et gérer ça avec du System.currentTimeMillis()

    Mais bon... Si quelqu'un a une idée.
    Merci de m'éclairer.
    • Partager sur Facebook
    • Partager sur Twitter
      21 septembre 2011 à 16:04:19

      public class Main {
      	
      	public static void main(String[] args) {
      		long now = System.currentTimeMillis();
      		long frequency = 3000;
      		long next = now+frequency;
      		do{
      			now = System.currentTimeMillis();
      			if(next<now){
      				System.out.println(1);
      				next+=frequency;
      			}
      		}
      		while(true);
      	}
      
      • Partager sur Facebook
      • Partager sur Twitter
        21 septembre 2011 à 16:07:13

        Wow !
        Quelle rapidité !
        Quelle efficacité !
        Mille merci.


        PS : hum je me sens assez mauvais sur ce coup ^^
        Encore merci !
        • Partager sur Facebook
        • Partager sur Twitter
          21 septembre 2011 à 23:12:41

          Attention c'est horrible de faire ça... le but de sleep c'est de soulager le système pendant le temps de la pause. Avec la "technique" de dorz tu verras que le processus correspondant à ton programme sera un gouffre à temps CPU. Aies pitié de ton pauvre ordinateur et utilise sleep...

          A savoir que si tu ne veux pas utiliser "explicitement" les Thread tu peux appeler la méthode sleep de façon statique, avec Thread.sleep(temps).
          • Partager sur Facebook
          • Partager sur Twitter
            22 septembre 2011 à 8:30:52

            Hum....
            Bon, je vais expliquer le vrai problème et vous me direz ce que vous en pensez.

            Contexte :
            Jeu dans lequel il y a pas mal de personnages.
            Pour les représenter j'utilise des sprites.

            J'avais donc un timer qui incrémentait le morceau d'image à afficher et une méthode d'affichage qui affichait le fameux morceau.
            quelque chose du genre :

            public static int FRAME_RATE_ANIMATION = 100;
            



            private Timer createTimer ()
            {
            	ActionListener action = new ActionListener ()
            	{
            		public void actionPerformed (ActionEvent event)
            		{
            			if(spriteFrameIndex < spriteFrameSize)
            				spriteFrameIndex++;
            			else
            				spriteFrameIndex = 0;
            
            		}
            	};
            	return new Timer (FRAME_RATE_ANIMATION, action);
            }
            




            public void draw(Graphics g) 
            {
            	g.drawImage(sprite,
            			(int)x, (int)y,
            			(int)(x + width), (int)(y + height),
            			spriteFrameIndex * width, 0, spriteFrameIndex * width + width, height, null);
            
            }
            



            Tout ça parait bien (du moins j’espère), mais il y a un vrai problème avec les Timer (enfin selon moi) car au bout de quelques minutes d'exécution, il y a un net ralentissement (ralentissement progressif) de l’animation.

            Je précise que le jeu n'est pas ralenti, le nombre de FPS ne bouge pas, et les déplacements des tirs et autres restent parfaitement fluides.
            Les ralentissements sont uniquement sur les animations. J'ai donc conclu qu'ils s'agissait des Timer.

            Après certains me diront : "passe aux Thread".
            C'était ma première option, mais je pense que trop de thread tue le thread, de plus j'ai lu que pr des animations les Timers étaient plus léger. Et très récemment je me suis dit que j'allais m'en passer tout simplement.

            Avez-vous déjà rencontrer un tel type de pb ?
            Auriez-vous une solution à me suggérer ?

            En tout cas merci bien de m'avoir répondu =)
            • Partager sur Facebook
            • Partager sur Twitter
              22 septembre 2011 à 10:23:31

              Je vais t'expliquer comment je fais en général pour ce genre de programmes.

              Tu fais 2 Thread :
              - un pour l'affichage, qui se contente de faire un repaint() puis une pause d'un temps calculé pour avoir le nombre de fps que tu veux.
              - un pour les mises à jour du modèle, c'est-à-dire les coordonnées de tes persos, l'indice de l'image de tes animations à afficher...

              Avec ça tu n'as que 2 Thread peu importe le nombre de personnages que tu affiches et les calculs du modèle ne baissent pas tes fps.
              • Partager sur Facebook
              • Partager sur Twitter

              Sleep sans thread ni timer

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown