-
7 Timer = lag
Bonjour à tous.
Pour ceux qui s'en souviennent, j'ai fais un puissance 4 très basique pour apprendre MVC (chose faite). Mais un élément m'interpelle :
Situation : une JFrame qui contient 7 JPanel (nommés colonnes)
Colonne contient un MouseListener qui déclenche un timer pour l'animation du jeton et qui se stoppe quand le jeton est à sa place.
Rien d'exceptionnel en soi. Mais ça rame quand je pose plusieurs jeton dans différentes colonnes ( avant que l'animation soit fini )
Bien entendu je pourrais redessiner seulement la partie du JPanel qui m'intéresse.
Ou utiliser un seul JPanel au lieu de 7 avec un seul timer.
Le problème serait surement résolu mais ma question est la suivante :
-Java2D et en particulier l'animation est telle aussi strict? Il me semble que la moindre erreur devient fatal pour la fluidité? Ai-je raison? Ai-je tord?
A vos clavier :)
-
Ou plus simplement tu utilises un seul timer au lieu de 7.
Tout simplement tu te débrouilles pour que ton Timer fasse des tops toutes les x millisecondes et déclenche un recalcul pour les éléments animés. Dans ce cas de figure c'est à l'élément animé de savoir de quel façon il doit s'afficher en fonction du temps depuis le dernier calcul ou depuis le démarrage de l'animation (au choix).
De fait tu devras mettre en place un système avec un Timer global (sous forme d'un singleton) auprès duquel tu enregistre tes objets animés. A chaque tic du timer celui parcoure les animations enregistrées, déclenche le recalcul de chacune, puis le repaint des composants associés.
Ou sinon tu te diriges vers un framework dédié à ce genre de choses comme trident (le plus récent en ce qui concerne java - et le blog du dev: http://www.pushing-pixels.org/?cat=16) ou le timingframework (qui est un peu en état végétatif de souvenir, avec un peu de doc écrite par les auteurs tout de même..
-
Il faut savoir ce que tu entends par "lag".
scintillement d'affichage blanc alterné avec l'animation?
animation plus lente que prévue?
d'une manière générale, tu devrais pouvoir avoir 15 20 50 timers sans "lag", mais tu peux lagger avec un seul timer. Les points critiques, sont la vitesse à laquelle fonctionne ta méthode paint, fait que oui ou non tu te content de ne redessinner que le nécessaire, le fait que oui ou non tu fasse le calcul pendant que l'affichage est "vide"
Exemple:
-> un paint de 10 ms dans lequel la première opération est une mise à 0 (via super.paint()).
-> 7 colonnes, chacune lançant le paint de manière globale (sans précalcul de la zone à redessiner donc) 10 fois par seconde. Ca fait donc 70 fois * 10 ms -> 700 ms / seconde, donc 70% du temps ou l'affichage est "blanc" => impression de lag. Si en plus tes timers font avancer d'un pas fixe ton jeton plutot que d'un pas dépendant de l'horloge, plus tu passera de temps à dessiner, plus te jetons avanceront lentement.
Il faut en pratique
-> un paint rapide, si possible effectuant les calcul sur un buffer en arrière plan, pour faire l'affichage au dernier moment, lorsque tout est calculé.
-> calculer dans tes timer la zone la plus petite possible à redessiner et faire appel à repaint(int x, int y, int width, int height)
-> Calculer l'étape courante de ton animation en fonction de l'horloge et non en fonction du nombre de déclenchement de timer (l'horloge ne prend pas de retard, elle), ceci afin de "sauter" des étapes lorsque la machine ne suit plus, ce qui diminue l'effet de lag
-
Merci à vous pour vos réponses, c'est exactement la réponse que je recherchais.
@tchize : lag = ralentissement dans mon cas.
Et mon timer appelais juste le repaint().
Le repaint allait chercher les instances de "Jeton" (contient x,y,Color) de la colonne. Pour dessiner un cercle.
Bref, pas du tous ergonomique en somme :aie: