Novembre 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | | | 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 | | Calendrier |
|
|
| Double buffer pour picture | |
| | |
Auteur | Message |
---|
Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Double buffer pour picture Jeu 11 Juin 2015 - 23:22 | |
| Les codes de Cosmos 70 et de Papydall marche très bien (quoi que dans le code de Papydall, moi, le programme sort directement de la boucle que je lance par F9 ou autre, donc pour que ça marche, j'ai modifié en - Code:
-
dim x0,y0 full_space 0 : 2d_fill_color 255,0,0 caption 0,"Déplacer la souris .... <CLICK> pour terminer" picture 10 : full_space 10 : color 10,0,0,0 : 2d_pen_color 255,255, 0 repeat x0 = mouse_x_position(10) : y0 = mouse_y_position(10) 2d_circle x0, y0, mod(x0,15)- mod(y0,15) if key_down_code = 27 then terminate until 1 = 0 Le code de Cosmos fonctionne bien mais j'ai modifié selon mon inspiration du moment comme ça: - Code:
-
' je promene ma souris ' escape pour sortir dim c,d, e, f, r width 0 ,1600 : height 0,900 picture 2 : width 2 ,1580 : height 2,860 : 2d_target_is 2 : hide 2 picture 3 : width 3 ,1580 : height 3,860 : ' clone de 2 pour la souris
image 4
repeat if key_down_code = 27 then terminate c= mouse_x_position(3) : d= mouse_y_position(3) :' la souris est testé sur le clone if e <> c and f<> d 2d_fill_color c / 12 + rnd(110), d / 10 + rnd(135),rnd (255) r = 5 : e = c : f = d 2d_circle c,d,r : display copy_image() : ' pour afficher sur la fenête 0 else if r < 30 and ( e<> 0 or f<>0) then r = r+0.25 2d_circle c,d,r : display copy_image() : ' pour afficher sur la fenête 0 end_if
until 1=0 end =============================== sub copy_image() 2d_image_copy 4,left(2),top(2),width(2),height(2) 2d_target_is 0: 2d_image_paste 4,left(2),top(2) : ' on recopie sur la fenêtre 2d_target_is 2 end_sub Mais de toute façon la technique du double buffer n'est pas utile ici comme on le voit avec le code de Papydall. Ca ne clignote déjà pas alors qu'il ne l'utilise pas. | |
| | | Invité Invité
| Sujet: Re: Double buffer pour picture Jeu 11 Juin 2015 - 23:27 | |
| Je m'excuse Papydall, mais le code que je propose est celui relevé dans le lien plus haut. On parle de clignotement, et savoir quand il existe, comment l'éviter. J'ai repris le code rectifié plus haut, et regardes la différence, en modifiant la variable: choixavec 2, le clignotement est insupportable, et avec 3, c'est correct. - Code:
-
' je promene ma souris ' escape pour sortir dim a,s ,c(100),x ,v ,d(100) , choix choix = 2 :' sans clone ou 3 avec clone width 0 ,1750 : height 0,1200 picture 2 : width 2 ,1650 : height 2,1100 : 2d_target_is 2 if choix = 3 HIDE 2 picture 3 : width 3 ,1650 : height 3,1100 : ' clone de 2 pour la souris end_if if choix = 3 then image 4 v=1 for x= 1 to 5 repeat pause 10 if key_down_code = 27 then terminate if mouse_right_down(choix)=0 display c(v)= mouse_x_position(choix) : d(v)= mouse_y_position(choix) :' la souris est testé sur le clone 2d_fill_color rnd(255), rnd(255),rnd (255) 2d_circle c(v),d(v),10 if choix = 3 then copy_image() : ' pour afficher sur la fenête 0 end_if until v=5 v=v+1 next x
end =============================== sub copy_image() 2d_image_copy 4,left(2),top(2),width(2),height(2) 2d_target_is 0: 2d_image_paste 4,left(2),top(2) : ' on recopie sur la fenêtre 2d_target_is 2 end_sub
Je peux te dire que lorsqu'on fait du texte sur un picture, on apprécie la différence. On s'est croisé Jicehel. Je quitte car je ne sais pas pourquoi mon ordi tourne à plein tub!. bizarre |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Double buffer pour picture Ven 12 Juin 2015 - 0:03 | |
| Déplacer la souris sans cliquer : le click arrête le tracé. Modifier la vitesse du déplacement de la souris (tantôt mouvement lent, tantôt rapide). Et appréciez votre chef d’œuvre ! - Code:
-
dim x0,y0 full_space 0 : 2d_fill_color 255,0,0 caption 0,"Déplacer la souris .... <CLICK> pour terminer" picture 10 : full_space 10 : color 10,0,0,0 : 2d_pen_color 255,255, 0 repeat x0 = mouse_x_position(10) : y0 = mouse_y_position(10) 2d_circle x0, y0,30 : 2d_rectangle x0,y0,x0+60,y0 + 60 until scancode <> 0
| |
| | | Invité Invité
| Sujet: Re: Double buffer pour picture Ven 12 Juin 2015 - 5:20 | |
| Désolé, mais j'ai l'impression qu'on s'égare. Je n'ai fait que de répondre à ceci: - Sergeauze a écrit:
- salut
fini le scintillement ? Bonne nouvelle ! ce code : https://panoramic.1fr1.net/t1065-ca-clignotte-a-qui-mieux-mieux J’espérais le voir amélioré Mais je ne suis pas assez doué pour le faire moi-même Si ça tente quelqu'un ;je serais curieux de voir ce que ça donne Là je ne suis pas hors sujet, et c'est pas mon programme. J'ai juste apporté la méthode de Silverman pour éviter le clignotement. |
| | | sergeauze
Nombre de messages : 391 Age : 72 Localisation : Hautes Alpes France Date d'inscription : 09/01/2010
| Sujet: Re: Double buffer pour picture Ven 12 Juin 2015 - 14:31 | |
| Salut à tous Je suis très reconnaissant à silverman pour son code qui va me permettre de rendre regardables certains de mes vieux codes :une petite révolution pour moi ! et qui suscite tout notre intérêt | |
| | | silverman
Nombre de messages : 970 Age : 52 Localisation : Picardie Date d'inscription : 18/03/2015
| Sujet: Re: Double buffer pour picture Sam 13 Juin 2015 - 11:23 | |
| Bonjour à tous, @sergeauze l'astuce que j'ai posté à un revers, la vitesse du code est très ralenti(c'est proportionnel à la surface d'affichage). Voici le code que tu as posté ici, et j'y ai ajouté une mesure de la vitesse d'affichage(dans la barre bleu). J'obtiens environ 1700 images/sec. - Code:
-
dll_on "kernel32" dim start_time,count_frame,count_time,fps start_fps_count()
' je promene ma souris ' escape pour sortir
picture 2 dim a,s ,c(100),x ,v ,d(100)
width 2 ,1650 height 2,1100 width 0 ,1750 height 0,1200 v=1 2d_target_is 0 for x= 1 to 5 repeat display if key_down_code = 27 then terminate if mouse_right_down(0)=0 display c(v)= mouse_x_position(2)
d(v)= mouse_y_position(2)
2d_fill_color rnd(255), rnd(255),rnd (255) 2d_circle c(v),d(v),5 end_if display get_fps() :' mesure la vitesse d'affichage until v=5 v=v+1
next x END sub start_fps_count() ' mesure en milliseconde, le temps écoulé depuis l'allumage du PC start_time=dll_call0("GetTickCount") count_frame=0 end_sub sub get_fps() ' mesure en milliseconde, le temps écoulé depuis l'allumage du PC count_time=dll_call0("GetTickCount") count_frame=count_frame+1 if (count_time-start_time)>=1000 fps=count_frame count_frame=0 start_time=count_time end_if caption 0,"FPS = "+str$(fps) end_sub
et le code avec l'astuce, là je descend à environ 60 images/sec. - Code:
-
dll_on "kernel32" dim start_time,count_frame,count_time,fps start_fps_count()
' je promene ma souris ' escape pour sortir
picture 2
dim a,s ,c(100),x ,v ,d(100)
' width 2 ,1650 ' height 2,1100 ' width 0 ,1750 ' height 0,1200 v=1
2d_target_is 2 INIT_DOUBLE_BUFFER(2)
for x= 1 to 5 repeat ' display if key_down_code = 27 then terminate if mouse_right_down(0)=0 ' display c(v)= mouse_x_position(0) d(v)= mouse_y_position(0) 2d_fill_color rnd(255), rnd(255),rnd (255) 2d_circle c(v),d(v),5 end_if ' display DOUBLE_BUFFER(2 , 0) get_fps() :' mesure la vitesse d'affichage until v=5 v=v+1 next x
END ' ' Les routines ' sub DOUBLE_BUFFER(picture_source , form_cible) 2d_image_copy picture_source+5000,0,0,width(picture_source),height(picture_source) 2d_target_is form_cible 2d_image_paste picture_source+5000,left(picture_source),top(picture_source) ' 2d_target_is picture_source end_sub
sub INIT_DOUBLE_BUFFER(picture_source) hide picture_source image picture_source+5000 end_sub
sub start_fps_count() ' mesure en milliseconde, le temps écoulé depuis l'allumage du PC start_time=dll_call0("GetTickCount") count_frame=0 end_sub sub get_fps() ' mesure en milliseconde, le temps écoulé depuis l'allumage du PC count_time=dll_call0("GetTickCount") count_frame=count_frame+1 if (count_time-start_time)>=1000 fps=count_frame :' nb d'images par seconde count_frame=0 start_time=count_time end_if caption 0,"FPS = "+str$(fps) end_sub
@cosmos70 - Citation :
- Mais j'aimerai que quelqu'un m'explique pourquoi alors que picture 3 est sur la form 0, on voit la copie du picture 2 sur la forme 0
C'est parceque "2d_image_copy" ne copie pas ce qui est affiché, mais ce qui est stocké dans une zone mémoire. Un picture est une zone mémoire(de la même manière que "image") attribué par Panoramic, donc on peu en copier un invisible et le coller(2d_image_paste) à l'écran(dans la mémoire tampon d'affichage pour être exact). Ce que l'on voit à l'écran c'est un résultat final, le mixage de toutes ces zones mémoires dirigé vers l'écran; le contenu de la mémoire tampon d'affichage en fait. Dans ton code, la zone mémoire 3 est active pour détecter la souris mais contient le contenu de la zone mémoire 2. | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Double buffer pour picture Sam 13 Juin 2015 - 11:51 | |
| C'est le même principe que la détection d'un clic sur une image qui récupère la position du clic sur l'image mais qui teste si on a cliqué sur un objet actif sur une autre image. | |
| | | sergeauze
Nombre de messages : 391 Age : 72 Localisation : Hautes Alpes France Date d'inscription : 09/01/2010
| Sujet: Re: Double buffer pour picture Sam 13 Juin 2015 - 11:56 | |
| salut @siverman Les resultats obtenus chez moi sont assez differents premier code petite surface entre 1032 et1051 fps deuxieme code tout l'ecran entre 1563 et 1577 Je suis sous vista édition familiale processeur coree double coeur | |
| | | silverman
Nombre de messages : 970 Age : 52 Localisation : Picardie Date d'inscription : 18/03/2015
| Sujet: Re: Double buffer pour picture Sam 13 Juin 2015 - 12:09 | |
| @Jicehel @sergeauze je suis sous XP, c'est surement pour cela que c'est plus long sur mon pc. | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Double buffer pour picture Sam 13 Juin 2015 - 12:53 | |
| A toi tu n'as pas suivi la discution pour les collisions par masques C'est un sujet en cours par rapport à mon articles sur les collisions (le n°2) qui était prévu et le développement des fonctions pour les sprites de Klaus. Comme toi qui fait travailler sur un picture caché que tu recopies à l'affichage, le principe du masque est d'afficher une "belle" image colorée comme on veut avec des objets qui peuvent avoir des formes complexes (genre une courgette, une lampe de chevé, une carafe, un pistolet, une porte vue en perspéctive de côté, etc) dont la détection du clic pourrait être assez fastidieuse par programmation. La technique du masque est de faire une version spéciale de cette image ou tout le fond est supprimé ou dans la technique de Klaus, une des composantes au moins est passé à 0 (Klaus à arbitrairement choisit le bleu) et de mettre les objets dans une couleur ou cette composante aura une valeur donnée (Klaus a pris des multiples de 4 de la composante bleue). Si on avait besoin de 255 objet, avec la même techinque, il suffirait juste de lire la composante bleue du pixel du masque (qui n'est pas visible) correspondant à l'endroit ou l'utilisateur à cliqué sur l'image associée que l'on affiche. C'est une méthode très utilisée dans les jeux type point and clic. Note: Le graphiste peut adapter la précision du clic de l'utilisateur en faisant déborder la zone sensible s'il le souhaite. | |
| | | Invité Invité
| Sujet: Re: Double buffer pour picture Sam 13 Juin 2015 - 13:16 | |
| Merci Silverman. D'accord pour 2d_image_copy ou paste. Là où je ne comprend pas, est que picture 3 est dessus, et invisible. Peut importe, ça fonctionne. Pour ce qui est de la vitesse, il n'est pas forcément souhaitable de 'double_bluffer ' à chaque modification. Pour ma part je le fais lorsque la page est prête, cela présente l'avantage d'afficher d'un coup, au lieu de voir le défilement d'écriture. Cela dépend du programme évidemment. |
| | | Contenu sponsorisé
| Sujet: Re: Double buffer pour picture | |
| |
| | | | Double buffer pour picture | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |