IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Java Discussion :

7 Timer = lag


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert Avatar de Ivelios
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Par défaut 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

  2. #2
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    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..

  3. #3
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    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

  4. #4
    Membre Expert Avatar de Ivelios
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Par défaut
    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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment faire un Timer de fonction PORTABLE ?
    Par dieuP1guin dans le forum C
    Réponses: 3
    Dernier message: 04/07/2003, 10h44
  2. [horloge] conflit caractère / timer
    Par JeanJean dans le forum C
    Réponses: 10
    Dernier message: 09/05/2003, 23h47
  3. [] [Réseau] Anti-timer, anti-idle
    Par clonevince dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 15/01/2003, 22h19
  4. Timer de précision
    Par guigui dans le forum MFC
    Réponses: 1
    Dernier message: 04/12/2002, 15h21
  5. Timer en µsecondes
    Par Dagobert dans le forum x86 16-bits
    Réponses: 3
    Dernier message: 25/11/2002, 00h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo