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

2D Java Discussion :

[Gestion animation] petit soucis de lenteur


Sujet :

2D Java

  1. #1
    Membre habitué
    Homme Profil pro
    Ingénieur Informatique
    Inscrit en
    Décembre 2005
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur Informatique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 146
    Points : 158
    Points
    158
    Par défaut [Gestion animation] petit soucis de lenteur
    J'ai déjà fait une petite question sur un problème avec le doublebuffering ici : http://www.developpez.net/forums/viewtopic.php?t=439724

    Effectivement, pour mon animation plus besoin de buffering et ceux avec mustang c'est encore plus vrai. Mais j'ai malgré tout un problème et vous saurez peut-être me conseiller pour l'éviter.
    J'ai créer donc un thread qui ressemble à un timer. je fais un repaint du jpanel, (dans lequel j'affiche un ensemble de sprites). et j'incremente pour certain objet un index pour dire op on affiche l'image suivante de telle animation.

    Au final, j'ai toujours mon menu (chose avec le doublebuffering qui n'était pas le cas). Et je n'ai pas d'effet de clipping. Vous pourriez vous dire pourquoi je viens poser des questions?

    Trés simple. la gestion des évenements est grandement ralenti car pour avoir quelque chose de fluide je fais une pause de le thread qui change les index et réaffiche la scéne toutes les 5ms. si c'est une valeur plus élevé l'animation n'est pas assez rapide... et fluide dans son déroulement!
    En contre partie, le temps processeur est trés occupé par mon petit jeu. Et mon menu a du mal à gérer les évements... de même le déplacement sur mon jpanel s'en ressent à cause de cela.
    Donc ce serai pour savoir si vous connaitriez une astuce pour améliorer ça.

    Je pense que ça doit existe car j'ai vu les jeux sur http://www.popcap.com/ qui sont fait en java... ils sont vachement bien fait :p
    Donc j'aimerais bien avoir la même fluidité entre l'animation graphique et la gestion des événément souris/clavier... (quoi que clavier reste plus lent apparement)

    merci d'avance[/url]
    Mon blog est sur https://arphonis.fr et bientôt d'autres fonctionnalités seront disponible dessus.

  2. #2
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    Je ne comprends pas tout a ton truc mais deja redessiner toutes les 5 ms c'est beaucoup trop. 40 a 60 trames par secondes suffisent amplement et ca correspond a entre 30 et 16 ms. Si tu veux accelerer l'animation, amplifie les mouvements de tes sprites, c'est le mieux a faire.

    Ensuite quand tu fais un repaint(), utilise la methode repaint(x, y, w, h) pour ne redessiner que la partie de l'ecran qui a change depuis la derniere trame de l'animation. Enfin, verifie ton code pour voir si tu ne fais pas des taches qui consomment beaucoup de temps processeur. Utiliser le profiler de NetBeans pour les identifier par exemple.
    Romain Guy
    Android - Mon livre - Mon blog

  3. #3
    Membre habitué
    Homme Profil pro
    Ingénieur Informatique
    Inscrit en
    Décembre 2005
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur Informatique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 146
    Points : 158
    Points
    158
    Par défaut
    Ok merci de ces conseils...

    Mais auparavant, j'ai une autre question. Vous voulez dire quoi par Amplifier l'animation? Mettre plus d'image à faire défile durant l'animation ?

    sinon voici le bout de code que j'ai mis pour faire des essais avant de m'y mettre sérieusement (sur c'est fait de façon trés heu mhmm... ^^)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    public class Panneau extends JPanel {
    	private RenderingThread renderingThread = new RenderingThread();
    	private Image terrain;
    	private Image f1;
    	private Image f2;
    	private Image f3;
    	private Image f4;
    	private Image f5;
    	private Image f6;
     
    	private int indexCourant = 0;
     
    	public Panneau() {
    		chargerImage();
    		//setVisible(true);
    		//setDoubleBuffered(true);
    	}
     
     
    	private void chargerImage() {
    		String cheminRepertoire = "HerbeTest.png";
    		File rep = new File(cheminRepertoire);
    		File fichier1 = new File("monstre1.png");
    		File fichier2 = new File("monstre2.png");
    		File fichier3 = new File("monstre3.png");
    		File fichier4 = new File("monstre4.png");
    		File fichier5 = new File("monstre5.png");
    		File fichier6 = new File("monstre6.png");
    		terrain = Toolkit.getDefaultToolkit().getImage(rep.getAbsolutePath());
    		f1 = Toolkit.getDefaultToolkit().getImage(fichier1.getAbsolutePath());
    		f2 = Toolkit.getDefaultToolkit().getImage(fichier2.getAbsolutePath());
    		f3 = Toolkit.getDefaultToolkit().getImage(fichier3.getAbsolutePath());
    		f4 = Toolkit.getDefaultToolkit().getImage(fichier4.getAbsolutePath());
    		f5 = Toolkit.getDefaultToolkit().getImage(fichier5.getAbsolutePath());
    		f6 = Toolkit.getDefaultToolkit().getImage(fichier6.getAbsolutePath());
    		MediaTracker tracker = new MediaTracker(this);
    		tracker.addImage(terrain, 0);
    		tracker.addImage(f1, 0);
    		tracker.addImage(f2, 0);
    		tracker.addImage(f3, 0);
    		tracker.addImage(f4, 0);
    		tracker.addImage(f5, 0);
    		tracker.addImage(f6, 0);
    		try {
    			tracker.waitForAll();
    		} catch (InterruptedException e) {
    			e.printStackTrace();
    		}
    		renderingThread.start();
    	}
     
    	public void paint(Graphics g) {
    		Graphics2D buffer = (Graphics2D)g;
    		boolean lignePaire = true;
    		for (int i = 0; i < 19; i++) {
    			int j = 0;
     
    			if (lignePaire) {
    				while (j < 55) {
    					buffer.drawImage(terrain, j * 64, i * 16, null);
    					j++;
    				}
    				lignePaire = false;
    			} else {
    				while (j < 55) {
    					buffer.drawImage(terrain, j * 64 + 32, i * 16, null);
    					j++;
    				}
    				lignePaire = true;
    			}
    			switch(indexCourant) {
    			case 1:
    				buffer.drawImage(f1,50,50,null);
    				break;
    			case 2:
    				buffer.drawImage(f2,50,50,null);
    				break;
    			case 3:
    				buffer.drawImage(f3,50,50,null);
    				break;
    			case 4:
    				buffer.drawImage(f4,50,50,null);
    				break;
    			case 5:
    				buffer.drawImage(f5,50,50,null);
    				break;
    			case 6:
    				buffer.drawImage(f6,50,50,null);
    				break;
    			}
     
    		}
    	}
     
    	class RenderingThread extends Thread {
    		public void run() {
    			while (true) {
    				try {
    					repaint(0,10,1260,950);
    					if(indexCourant >6)
    						indexCourant = 0;
    					else
    						indexCourant++;
    					sleep(16);
    				} catch (Exception e) {
    					;
    				}
    			}
    		}
    	}



    EDIT:
    rajout du code, cette classe est directement ajout à un JFrame qui contient seulement un pauvre menu pour faire la fermeture de la fenetre...
    Mon blog est sur https://arphonis.fr et bientôt d'autres fonctionnalités seront disponible dessus.

  4. #4
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    Par exemple si tu deplaces ton personnage de 1 pixel 100 fois par seconde, tu peux aussi le deplacer de 25 pixels 4 fois par seconde. Le principal est que l'animation apparaisse fluide.
    Romain Guy
    Android - Mon livre - Mon blog

  5. #5
    Membre habitué
    Homme Profil pro
    Ingénieur Informatique
    Inscrit en
    Décembre 2005
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur Informatique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 146
    Points : 158
    Points
    158
    Par défaut
    Ok merci j'ai compris.

    D'ailleurs j'ai vu aussi une chose. C'est ma méthode paint qui prend beaucoup de temps!

    lorsqu'au lieu de tout redessiner de a à z, j'ai lance qu'une fois le dessin du fond. Puis ensuite je redessine dans le paint que mon animation et la... pfiou. C'est ultra giga rapide lol.

    Donc il va me falloir, gérer le rafraichissement "local" juste sur les parties interresser ou le dessin sera différent. Pas évident tout ça ^^...

    EDIT:
    Par contre en procédant ainsi j'ai un soucis quand je clic sur le menu, mon image de fond disparait :s
    Mon blog est sur https://arphonis.fr et bientôt d'autres fonctionnalités seront disponible dessus.

  6. #6
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    Dans paint il faut tout dessiner mais si necessaire. D'ou ma remarque sur repaint(x, y, w, h).
    Romain Guy
    Android - Mon livre - Mon blog

  7. #7
    Membre habitué
    Homme Profil pro
    Ingénieur Informatique
    Inscrit en
    Décembre 2005
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur Informatique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 146
    Points : 158
    Points
    158
    Par défaut
    Oui j'ai bien compris. Reste que lors d'un clic sur le menu... l'image qu'il y avait n'est plus là. Il me faut donc à chaque manipulation du menu, redessiner la zone recouverte par le menu?

    C'est assez lourd comme méthode à gérer je trouve, mais bon si c'est le prix à payer pour arriver à avoir quelque chose de correct pour le rendu!
    Mon blog est sur https://arphonis.fr et bientôt d'autres fonctionnalités seront disponible dessus.

  8. #8
    Membre habitué
    Homme Profil pro
    Ingénieur Informatique
    Inscrit en
    Décembre 2005
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur Informatique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 146
    Points : 158
    Points
    158
    Par défaut
    Sinon mon véritable problème réside dans le fait que mon background est constitué d'un ensemble de sprites. Comme dans les jeux à la sim city ou autre.. on peut changer la case représentant un terrain.
    Mais comme le terrain est grand, je me retrouve à devoir dessiner à l'écran beaucoup d'image. C'est ce qui provoque cette surchage processeur et parfois allant jusqu'a un manque de fluidité

    Donc j'aimerais savoir s'il est possible de créer une image constitué de plein de sprite justaposé et c'est cette image là que l'on affiche. Aprés je n'aurais plus qu'a ajouter juste les sprites qui auront changé de place ou d'aspect visuel (autre image vis à vis du déroulement de l'animation)

    Merci d'avance
    Mon blog est sur https://arphonis.fr et bientôt d'autres fonctionnalités seront disponible dessus.

  9. #9
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    Quand tu as un Graphics, tu as la zone a redessiner. Tu l'obtiens en faisant getClip().getBounds(). Ca te donne le rectangle dans lequel tu dois dessiner. Tu dois t'arranger pour ne dessiner que les sprites qui sont dans ce rectangle et tes performances seront bien meilleures.
    Romain Guy
    Android - Mon livre - Mon blog

  10. #10
    Membre habitué
    Homme Profil pro
    Ingénieur Informatique
    Inscrit en
    Décembre 2005
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur Informatique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 146
    Points : 158
    Points
    158
    Par défaut
    Ah un grand merci :p je l'ignorais ça. Je teste de suite
    Mon blog est sur https://arphonis.fr et bientôt d'autres fonctionnalités seront disponible dessus.

Discussions similaires

  1. Petit soucis pour se connecter à l'adsl
    Par Blowih dans le forum Réseau
    Réponses: 4
    Dernier message: 28/07/2004, 00h16
  2. petit soucy de fenetre cmd
    Par FeetloveR666 dans le forum Windows
    Réponses: 5
    Dernier message: 03/07/2004, 14h24
  3. petit soucis lors d'un LOAD DATA INFILE
    Par Jovial dans le forum SQL Procédural
    Réponses: 9
    Dernier message: 04/06/2004, 11h58
  4. Réponses: 6
    Dernier message: 21/01/2004, 13h25
  5. [DEBUTANT] petits soucis avec un prgm de chat
    Par LechucK dans le forum MFC
    Réponses: 8
    Dernier message: 19/01/2004, 16h52

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