Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Affichage Multi-Thread

4 réponses
Avatar
Barboas
Bonjour,

Voici le deal:

j'ai un JFrame, sur ce JFrame j'ai d'un cote (gauche) une colone de boutons,
et a droite une zone de dessins (des JPanel).

A chaque fois que je presse sur un bouton, un nouveau thread "ball" est
cree, qui deplace une balle dans la zone de dessin de droite (une ball qui
rebondie..)

J'ai un autre et unique thread qui fait deplacer un avion dans la zone
dessin.
Et eventuellement un Background qui va se reaficher a chaque fois, pour pas
laisser de trainées...

Ce que j'affiche ce sont des images (sprites), donc la du coup, si je
n'utilise pas de Double-Buffering, VIVE le clignotage.

Bon, C'est la que j'ai un problème, je n'arrive pas a trouvé un moyen
d'afficher toutes ces images, correcteemnt SANS cligontement.

J'ai deja essayé plusieurs chose:

Chaque thread affiche son buffer.. mais la ca rame sec (normale si je clique
40 fois sur lancer une balle... il y aura 40 buffer)

j'ai essayer d'implenter un buffer "unique" (un thread affichage qui s
occupe d afficher le buffer), mais comme je fait des Sleep(random) pour les
balles, Ca clignote beaucoup...

SI quelqu'un a un bonne solution à me proposer, je suis pronneur !

d'avance merci!

4 réponses

Avatar
Black Myst
Bonjour,

(...)

SI quelqu'un a un bonne solution à me proposer, je suis pronneur !

d'avance merci!


Si tu essaie de faire dessiner une zone d'affichage par 40 threads en
même temps, tu n'arrivera jamais à rien. Swing est mono-threadé. Il n'y
a QUE le thread AWT-event qui peut toucher à l'écran.

Version simple :
----------------

Dans ton cas, tu devrais avoir 2 threads.
- le thread AWT qui dessine.
- le thread d'animation qui fait vivre ton jeu.

Dans le paint() de ton panel, tu doit afficher le background et tous les
sprites. Ton thread d'animation ne fait que recalculer régulièrement la
position des thread.

Note : Quand le thread d'animation déplace un sprite, il fait un repaint
sur le panel pour forcé le thread AWT à revenir. Swing temporise les
demande de repaint, donc pas trop de question à se poser

Version plus cool :
-------------------

3 thread :
- Le thread de calcule de l'image. Il fait la même chose que l'AWT
précédament, mais dans une image. Quand l'image est prête, il fait un
repaint, et dors un certain temps (en fonction du nombre de ftps souhaité)
- Le thread AWT passe à la demande pour afficher l'image.
- Le thread d'animation ne change pas.

De cette manière, le thread AWT a le minimum de chose à faire, le reste
de l'application sera donc plus réactif.


Voila
BlackMyst

Avatar
Xavier Tarrago
Pour éviter le clignotement, il faut activer le double-buffering.

Le multithread n'est pas utile sauf si une tâche de calcul longue est
nécessaire entre deux actions d'affichage (par exemple si le calcul de la
position de l'avion prend du temps. En général, il est préférable de
commencer sans multithread et de faire évoluer vers une architecture
multithread si on constate des gels de l'affichage dus à des calculs trop
longs.

On peut utiliser du double-buffering ET des buffers pour des sprites. C'est
indépendant du fait d'utiliser des threads ou pas et ca a un impact
seulement sur l'utilisation mémoire. On crée une BufferedImage, un Graphic2d
pour dessiner dedans. On stocke la BufferedImage pour la réutiliser et quand
on veut la dessiner, on fait drawImage sur le JPanel avec double-buffering
activé et ça devrait le faire.

Hope it helps^^

"Barboas" a écrit dans le message de news:
465ad764$
Bonjour,

Voici le deal:

j'ai un JFrame, sur ce JFrame j'ai d'un cote (gauche) une colone de
boutons, et a droite une zone de dessins (des JPanel).

A chaque fois que je presse sur un bouton, un nouveau thread "ball" est
cree, qui deplace une balle dans la zone de dessin de droite (une ball qui
rebondie..)

J'ai un autre et unique thread qui fait deplacer un avion dans la zone
dessin.
Et eventuellement un Background qui va se reaficher a chaque fois, pour
pas laisser de trainées...

Ce que j'affiche ce sont des images (sprites), donc la du coup, si je
n'utilise pas de Double-Buffering, VIVE le clignotage.

Bon, C'est la que j'ai un problème, je n'arrive pas a trouvé un moyen
d'afficher toutes ces images, correcteemnt SANS cligontement.

J'ai deja essayé plusieurs chose:

Chaque thread affiche son buffer.. mais la ca rame sec (normale si je
clique 40 fois sur lancer une balle... il y aura 40 buffer)

j'ai essayer d'implenter un buffer "unique" (un thread affichage qui s
occupe d afficher le buffer), mais comme je fait des Sleep(random) pour
les balles, Ca clignote beaucoup...

SI quelqu'un a un bonne solution à me proposer, je suis pronneur !

d'avance merci!





Avatar
Barboas
Ok.. merci des explications!

mais dans ma tête c'est encore flou, de comment je doit "structurer" mon
programmes...
Je ne comprend pas comment faire pour communique les resultats des
deplacement au thread d'affichage..

Voila comment je vois la structure:

void main{

new Fenetre()
}

classe Fenetre extends JFrame {

//creation de ma fentre..

//C'est dans ce Jpanel que tout va ce dessiner...
// mais comment faire ??
//Je doit creer une classe panelZoneDeJeux qui extends JPanel pour y
redefinir les methode paint etc.. ?
//puis je passe panelZoneDeJeux quand je creer mes balle et bateau ?
//puis dans Balle et Bateau je fait un panelZoneDeJeux.paint() ??
panelZoneDeJeux = new JPanel();

panelDeGaucheAvecMesBoutons = new JPanel
//ajout des boutons, avec quand je clique dessus ----> BAlle balle = new
Balle; balle.start() //lancement du thread
}


clase Balle extends thread {
//Je fait bouger mes balles
int x,y sont donc modifié..
}

classe Avion extends thread {
//je fait bouger mon avion
int x,y sont donc modifé aussi...
}

merci
"Black Myst" <Black_point_Myst_chez_free_point_fr> a écrit dans le message
de news: 465b1cd9$0$2308$
Bonjour,

(...)

SI quelqu'un a un bonne solution à me proposer, je suis pronneur !

d'avance merci!


Si tu essaie de faire dessiner une zone d'affichage par 40 threads en même
temps, tu n'arrivera jamais à rien. Swing est mono-threadé. Il n'y
a QUE le thread AWT-event qui peut toucher à l'écran.

Version simple :
----------------

Dans ton cas, tu devrais avoir 2 threads.
- le thread AWT qui dessine.
- le thread d'animation qui fait vivre ton jeu.

Dans le paint() de ton panel, tu doit afficher le background et tous les
sprites. Ton thread d'animation ne fait que recalculer régulièrement la
position des thread.

Note : Quand le thread d'animation déplace un sprite, il fait un repaint
sur le panel pour forcé le thread AWT à revenir. Swing temporise les
demande de repaint, donc pas trop de question à se poser

Version plus cool :
-------------------

3 thread :
- Le thread de calcule de l'image. Il fait la même chose que l'AWT
précédament, mais dans une image. Quand l'image est prête, il fait un
repaint, et dors un certain temps (en fonction du nombre de ftps souhaité)
- Le thread AWT passe à la demande pour afficher l'image.
- Le thread d'animation ne change pas.

De cette manière, le thread AWT a le minimum de chose à faire, le reste de
l'application sera donc plus réactif.


Voila
BlackMyst



Avatar
Barboas
voir reponse.
"Barboas" a écrit dans le message de news:
465ad764$
Bonjour,

Voici le deal:

j'ai un JFrame, sur ce JFrame j'ai d'un cote (gauche) une colone de
boutons, et a droite une zone de dessins (des JPanel).

A chaque fois que je presse sur un bouton, un nouveau thread "ball" est
cree, qui deplace une balle dans la zone de dessin de droite (une ball qui
rebondie..)

J'ai un autre et unique thread qui fait deplacer un avion dans la zone
dessin.
Et eventuellement un Background qui va se reaficher a chaque fois, pour
pas laisser de trainées...

Ce que j'affiche ce sont des images (sprites), donc la du coup, si je
n'utilise pas de Double-Buffering, VIVE le clignotage.

Bon, C'est la que j'ai un problème, je n'arrive pas a trouvé un moyen
d'afficher toutes ces images, correcteemnt SANS cligontement.

J'ai deja essayé plusieurs chose:

Chaque thread affiche son buffer.. mais la ca rame sec (normale si je
clique 40 fois sur lancer une balle... il y aura 40 buffer)

j'ai essayer d'implenter un buffer "unique" (un thread affichage qui s
occupe d afficher le buffer), mais comme je fait des Sleep(random) pour
les balles, Ca clignote beaucoup...

SI quelqu'un a un bonne solution à me proposer, je suis pronneur !

d'avance merci!