Partage
  • Partager sur Facebook
  • Partager sur Twitter

Scintillement applet

    30 décembre 2008 à 19:51:45

    Bonjour a tous,

    Depuis peu je me met au JAVA, un langage fort agréable ma fois :)
    Je rencontre depuis peu un petit soucis dans l'élaboration de mon projet actuel.

    En effet, lorsque on lance l'applet, on remarque un scintillement super génant. Le problème c'est que je ne sait pas du tout comment y remédier, c'est pour cela que je fait appel a vous.

    Voici le lien pour accéder a l'applet en ligne :
    Cliquez ici

    Voici le lien vers les sources (je pense que les modifs seront à appliquer sur la class Main())
    Cliquez ici pour les sources

    Je vous remercie d'avance d'avoir pris quelques minutes pour m'aider.

    Bonne soirée,
    • Partager sur Facebook
    • Partager sur Twitter
      30 décembre 2008 à 23:30:56

      mhh je n'ai pas regardé tes sources :p

      mais je pense que ça pourrais venir d'un probleme de thread :o
      ta méthode qui repeind, est elle bien appelée a partir d'un autre thread (autre que le thread principale) ?

      en faite, l'important c'est que les calcules et le sleep soientt fait dans un autre thread que celui qui repeint :
      quand tu appel la méthode repaint, c'est le thread principale qui repeint (peu importe de quel thread il a été appelé :o )
      donc si il est occupé a dormir ou a faire des calcules :p il ne sais pas repeindre


      maintenant c'est juste une hypothese ^_°
      j'ai pas lut le code source
      • Partager sur Facebook
      • Partager sur Twitter
        31 décembre 2008 à 17:17:47

        Salut,

        Merci de ta réponse, en effet le soucis doit venir de la. Je me suis rendu compte que mon code était super mal structuré, voir même pas structuré du tout (je n'ai vraiment pas l'habitude de l'héritage et toutes les petites subtilités de l'OO).

        Je ne met pas ce sujet en résolu, je posterai ci dessous si j'ai encore des questions.

        Bonne soirée à tous!
        • Partager sur Facebook
        • Partager sur Twitter
          2 janvier 2009 à 18:33:58

          Bonsoir,

          Je me suis donc penché sur le problème, et apparemment, la solution est d'utiliser le double buffering. Ok moi je veux bien, mais le problème c'est qu'après avoir implémenté le double buffering, je remarque que la vitesse du jeu est différente sur mes deux PCs (l'un Simple Coeur @ 1.6GHz, l'autre Double coeur @ 2GHz)

          Je vous poste le code de ma méthode update() pour que vous m'indiquiez comment améliorer certaines choses (si possible), ou bien si une solution plus performante existe (ce dont je ne doute pas).

          public void update( Graphics g ) 
              {
              	// initialisation du buffer
              	if (dbImage == null)
              	{
              	      dbImage = createImage(main.getSize().width, main.getSize().height);
              	      dbg = dbImage.getGraphics();
              	}
              	
              	// On efface le fond
              	dbg.setColor(Color.white);
              	dbg.fillRect(0, 0, main.getSize().width, main.getSize().height);
          
              	// On dessine les billes presentes sur le plateau de jeu
              	dbg.setColor(getBackground());
              	ArrayList<Bille> ListBilles = gestB.getListBilles();
              	for (Bille b : ListBilles)
              	{
              		dbg.setColor(b.getColor());
              		dbg.fillOval(b.getXPosition(), b.getYPosition(), b.getTailleBille(), b.getTailleBille());
              	}
              	
              	// On redessine notre bille
              	dbg.setColor(maBille.getColor());
              	dbg.fillOval(maBille.getXPosition(), maBille.getYPosition(), maBille.getTailleBille(), maBille.getTailleBille());
              	
              	paint(dbg);
          
              	// On colle l'image
              	g.drawImage (dbImage, 0, 0, this); 
              }
          


          Merci d'avance :)
          • Partager sur Facebook
          • Partager sur Twitter
            2 janvier 2009 à 18:59:32

            salut,

            comme d'habitude, la faq de developpez à réponse à tout

            voir ici : http://java.developpez.com/faq/gui/?pa [...] eringHardware (double buffering hardware)

            ça permet d'utiliser le buffer de la carte graphique plutôt que celui de la ram, mais c'est un peu différent à implémenter (dans le sens où tu fais une boucle de rendu dans un autre thread et tu n'utilise plus repaint())
            • Partager sur Facebook
            • Partager sur Twitter
              2 janvier 2009 à 19:12:11

              faire le double buffering sur la carte graphique c'est pas mieux que sur la ram?
              enfin je veux dire plus rapide ?
              (bref je me dis que la solution que tu propose ici est meilleur que celle que j'utile jusqu'à présent :p
              sauf si par défault java utilise la mémoire de la carte graphique =/
              • Partager sur Facebook
              • Partager sur Twitter
                2 janvier 2009 à 19:17:36

                par défaut java fais pas de double buffering...
                • Partager sur Facebook
                • Partager sur Twitter
                  2 janvier 2009 à 19:40:54

                  Merci beaucoup quarante-sept, je ne savais pas que par défaut tout était fait dans la RAM (ah quand on débute...)
                  Snooooopy, je pense que tu as mal lu :p

                  Citation : Snooooopy

                  faire le double buffering sur la carte graphique c'est pas mieux que sur la ram?


                  quarante-sept n'a jamais dit le contraire :)

                  Merci a vous deux d'avoir pris un petit moment a me répondre.
                  Bonne soirée!

                  (encore une fois je laisse le sujet non résolu, et le mettrai lorsque je n'aurai plus de questions concernant la partie graphique de mon mini jeux)
                  • Partager sur Facebook
                  • Partager sur Twitter
                    2 janvier 2009 à 19:45:35

                    Citation : quarante-sept

                    par défaut java fais pas de double buffering...


                    oui mais ce que je me demandais (excuse moi me suis mal exprimer :o )

                    par default java utilise la ram ou bien la mémoire de la carte graphique ?


                    @mistigri :p ben wais mais je connaissais pas :p donc je demandais
                    • Partager sur Facebook
                    • Partager sur Twitter
                      3 janvier 2009 à 11:49:03

                      ben par défaut java n'utilise pas de buffer offscreen, tout est transmit en direct à la carte graphique.

                      C'est quand on fait du double buffering que l'on stocke sur la RAM (ou la VRAM) un buffer offscreen sur lequel on va dessiner, et qu'on n'envoie à la carte graphique qu'après l'avoir entièrement dessiné.

                      Donc pour répondre à ta question. Le buffer qui va stocker le dessin en attente du rafraîchissement de l'écran est toujours sur la VRAM (carte graphique).
                      • Partager sur Facebook
                      • Partager sur Twitter

                      Scintillement applet

                      × 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