larryj
Messages postés3Date d'inscriptionmercredi 6 décembre 2000StatutMembreDernière intervention 9 juin 2009 28 juil. 2008 à 13:13
merci beaucoup pour cette source
Ça va me permettre de terminé ma petite application.
10/10
nicolassan551
Messages postés1Date d'inscriptionmercredi 6 octobre 2004StatutMembreDernière intervention 3 juillet 2008 3 juil. 2008 à 16:19
oui, joli boulot Guillaume :)
c'est interessant de voir que l'on peut faire une animation sympa avec GDI+, je vais peut être me décider, j'hésitais entre wpf et directX !
Le code est propre, c'est sympa !
guillaume1136
Messages postés21Date d'inscriptionjeudi 10 novembre 2005StatutMembreDernière intervention 3 juin 2008 3 juin 2008 à 20:54
Bonjour, merci pour tes commentaires, en faite oui c'est normal, pour que les formes soit en couleur tu dois changer la ligne suivante : Private Const DEGRADE_NAME As String = "Black and White" par Private Const DEGRADE_NAME As String = "Arc en ciel", elle se trouve dans le fichier FormMain, ligne 20. Oui d'autant plus que certaines fonctions du GDI+ sont très puissantes, comme celle qui permet de faire des dégradés dans un polygone, mais il n'y a pas d'exemple dans cette source.
The Meteorologist
Messages postés232Date d'inscriptionjeudi 18 janvier 2007StatutMembreDernière intervention 3 novembre 20111 1 juin 2008 à 15:44
Je n'ai pas pris assez le temps de regarder le code excuse-moi, ça m'a juste surpris en ayant vu la capture. En tout cas c'est très intéressant, je passais toujours par la case C++ pour programmer mes jeux étant donné que le rendu était toujours horrible avec GDI+. Maintenant j'y réfléchirais à deux fois, merci.
Simon
The Meteorologist
Messages postés232Date d'inscriptionjeudi 18 janvier 2007StatutMembreDernière intervention 3 novembre 20111 1 juin 2008 à 15:37
Bonjour guillaume1136,
Chez moi les polygones sont tous en noir et blanc ? Est-ce un bogue ou est-ce normal ?
Simon
guillaume1136
Messages postés21Date d'inscriptionjeudi 10 novembre 2005StatutMembreDernière intervention 3 juin 2008 6 avril 2008 à 12:49
Salut
Merci, on peu dire que j'ai mis le temps sa fesait 6 mois que je devais le faire.
Oui en effet il y a une augmentation d'environ 10 fps.
Sinon le contenu dessiné est resté le même, il y avais déja la transparence des formes.
Par contre il y a une nouvelle classe pour l'affichage des couleurs.
Merci pour ta suggestion je vais corriger ça, et merci pour tes encouragements.
Arnal88
Messages postés96Date d'inscriptionsamedi 21 octobre 2006StatutMembreDernière intervention25 avril 2009 5 avril 2008 à 17:48
Salut!
C'est cool que t'ai mis à jour ton code.
Excellent code.
Mais j'ai pas gardé l'ancienne version.. Est-ce que tu as constaté une augmentation du FPS ?
Ou alors tu as aussi changé ce qui doit être affiché... Il y avait déjà la transparence des formes ?
Sinon une dernière suggestion :
La valeur du FPS change vraiment rapidement, c'est impossible à lire.
Essaye de la stabiliser en faisant une "moyenne glissante" sur les 100 dernières valeurs par exemple. Cette moyenne devrait changer moins vite..
En tout cas, pour moi, c'est 10/10
Ahweb
Messages postés48Date d'inscriptionlundi 2 août 2004StatutMembreDernière intervention15 octobre 2007 14 oct. 2007 à 21:08
Excellente source ;)
J'attendrai moi aussi la mise à jour :)
Arnal88
Messages postés96Date d'inscriptionsamedi 21 octobre 2006StatutMembreDernière intervention25 avril 2009 13 oct. 2007 à 20:26
Merci pour tes encouragements..
Et bon courage pour la mise à jour de ta source...
guillaume1136
Messages postés21Date d'inscriptionjeudi 10 novembre 2005StatutMembreDernière intervention 3 juin 2008 13 oct. 2007 à 18:01
Merci de ton commentaire.
Ta méthode est très interressante, et bien plus logique au niveau de se qui se passe en mémoire en effet, c'est se que je voulait faire avec ma source, mais je m'en été juste aproché.
Je vais mettre à jour ma source avec ta méthode, j'ai constaté son efficacité avec ta source sur la chimie, c'est du joli boulot !!
Arnal88
Messages postés96Date d'inscriptionsamedi 21 octobre 2006StatutMembreDernière intervention25 avril 2009 13 oct. 2007 à 15:43
Bon programme. C'est vraiment bien fait.
J'ai pour ma part déjà été confronté au scintillement, et j'ai trouvé la solution dans l'aide MSDN. Mais le mécanisme de double buffer qu'elle décrit n'est pas le même que le tien.
Ton programme utilise deux Graphics, un en liaison avec un Bitmap pour dessiner dedans, et l'autre en liaison avec la surface de la Form pour transférer l'image à l'écran.
Le mécanisme que j'avais trouvé est le suivant :
''' Initialisation :
Dim currentContext As BufferedGraphicsContext
Dim myBuffer As BufferedGraphics
Avec ce mécanisme, on utilise vraiment une mise en mémoire tampon. C'est donc plus rapide et moins gourmand en ressources processeur.
Essaye de te pencher là dessus, mais je suis sûr que tu peux encore accélérer ton prog avec cette méthode.
apxa
Messages postés188Date d'inscriptionmercredi 15 mai 2002StatutMembreDernière intervention25 avril 2009 11 oct. 2007 à 20:26
iop all,
C'est très bien ca.
De toute facon il est bien connu que le principe de double buffering s'avere le plus efficace pour une fluidité d'animation.
Have Fun ;)
Adn56
Messages postés1172Date d'inscriptionjeudi 24 mai 2007StatutMembreDernière intervention28 septembre 20131 11 oct. 2007 à 19:54
+10 pour moi aussi (même si j'ai pas encore tout pigé au code lol, j'suis trop noob ^^)
TigerFab
Messages postés115Date d'inscriptionsamedi 15 février 2003StatutMembreDernière intervention18 mai 2008 11 oct. 2007 à 19:39
Bravo, bel exemple concret et efficace ! 10/10 pour moi
guillaume1136
Messages postés21Date d'inscriptionjeudi 10 novembre 2005StatutMembreDernière intervention 3 juin 2008 11 oct. 2007 à 16:14
Tout d’abord merci de tes commentaires,
Je viens de tester de déclencher l’événement OnPaint à partir de Panel1.Invalidate ()
mais le problème reste apparemment le même chez moi le graphique clignote toujours.
En revanche la solution pour déclencher cet événement sans que son graphique soit effacé est d'appeler l'événement en lui passant les bons paramètres:
Me.Panel1_Paint(Me, New PaintEventArgs(Viewable, New Rectangle(0, 0, Me.Panel1.Width, Me.Panel1.Height)))
J'ai mis à jour ma source avec ceci.
Adn56
Messages postés1172Date d'inscriptionjeudi 24 mai 2007StatutMembreDernière intervention28 septembre 20131 11 oct. 2007 à 12:02
Ok dsl, j'ai trouvé ^^ il suffit de raccourcir le nom de ton dossier ou de le placer vers un chemin plus cours (style C:\soft\ et non pas c\docu & sett\utilisateur\bureau\prog....qui prends plus de 260 caractéres :p)
Adn56
Messages postés1172Date d'inscriptionjeudi 24 mai 2007StatutMembreDernière intervention28 septembre 20131 11 oct. 2007 à 11:59
le code est tres bien commenté, mais en revanche j'ai un bug de nom trop long !
Erreur 1 Impossible d'écrire dans le fichier de sortie "obj\Debug\Double_Buffered_Panel_Exemple.Resources.resources". Le chemin d'accès spécifié, le nom de fichier ou les deux sont trop longs. Le nom de fichier qualifié complet doit comprendre moins de 260 caractères et le nom du répertoire moins de 248 caractères. Double Buffered Panel Exemple
et ce trois fois de suite, plus un plantage du Svhost au lancement de VB studio, cela sens l'archive conrompue ! Peux tu la DL et regarder cela ? merci +++
Adn56
Messages postés1172Date d'inscriptionjeudi 24 mai 2007StatutMembreDernière intervention28 septembre 20131 11 oct. 2007 à 08:14
salut, je vais de ce pas étudier ton code,
mais perso je fais tout un tas de dessin dans le forms.paint et cela ne clignote pas. J'ai positionné le double buffer dans les propriétés et j'utilise un invalidate() à la place du refresh().
Conclusion, cela reste tout de même assez chaud pour un noob comme moi de trouver une méthode fiable et passe partout pour simplement faire un dessin -_-'
Merci pour ta source qui devrait me permettre d'avancer un peu. ++
guillaume1136
Messages postés21Date d'inscriptionjeudi 10 novembre 2005StatutMembreDernière intervention 3 juin 2008 10 oct. 2007 à 20:12
Excuse moi j'ai oublier.
Pour que la demonstration ci-dessus marche il faut aussi ajouter Me.Panel1.Refresh()
a la fin du Sub Timer1.Tick
guillaume1136
Messages postés21Date d'inscriptionjeudi 10 novembre 2005StatutMembreDernière intervention 3 juin 2008 10 oct. 2007 à 20:09
C'est ce que je voulais faire au départ mais à ma grande déception lorsque on déssine sur avec l'événement OnPaint l'image clignote à nouveau...
Explication: au déclanchement de l'évenement OnPaint le graphique est effacer.
Le temps que l'on affiche notre image, une image toute blanche qu vien se glisser.
Cela est du au taux de rafraichisement de l'écran, le temps entre l'effacement du graphique et l'affichage de notre image éxéde le temps qu'il faut à l'écran pour afficher une image, d'ou l'image blanche.
Il est dailleur interessent de constater que plus l'instruction avant l'affichage de notre image est longue plus le temps d'affichage de l'image blanche est long.
J'espère que mon explication est compréhensible.
Tu peu t'en faire la démonsration en ajoutant le sub :
Private Sub Panel1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Panel1.Paint
e.Graphics.DrawImage(Me.BackBuffer, 0, 0)
End Sub
et en suprimant le : Viewable.DrawImageUnscaled(BackBuffer, 0, 0)
a la fin du Sub Timer1.Tick
FREMYCOMPANY
Messages postés276Date d'inscriptionjeudi 12 janvier 2006StatutMembreDernière intervention22 décembre 2008 10 oct. 2007 à 19:27
Intéressant !
Dommage que tu ne donne pas d'exemple concret utilsant l'évènement onPaint ;)
28 juil. 2008 à 13:13
Ça va me permettre de terminé ma petite application.
10/10
3 juil. 2008 à 16:19
c'est interessant de voir que l'on peut faire une animation sympa avec GDI+, je vais peut être me décider, j'hésitais entre wpf et directX !
Le code est propre, c'est sympa !
3 juin 2008 à 20:54
1 juin 2008 à 15:44
Simon
1 juin 2008 à 15:37
Chez moi les polygones sont tous en noir et blanc ? Est-ce un bogue ou est-ce normal ?
Simon
6 avril 2008 à 12:49
Merci, on peu dire que j'ai mis le temps sa fesait 6 mois que je devais le faire.
Oui en effet il y a une augmentation d'environ 10 fps.
Sinon le contenu dessiné est resté le même, il y avais déja la transparence des formes.
Par contre il y a une nouvelle classe pour l'affichage des couleurs.
Merci pour ta suggestion je vais corriger ça, et merci pour tes encouragements.
5 avril 2008 à 17:48
C'est cool que t'ai mis à jour ton code.
Excellent code.
Mais j'ai pas gardé l'ancienne version.. Est-ce que tu as constaté une augmentation du FPS ?
Ou alors tu as aussi changé ce qui doit être affiché... Il y avait déjà la transparence des formes ?
Sinon une dernière suggestion :
La valeur du FPS change vraiment rapidement, c'est impossible à lire.
Essaye de la stabiliser en faisant une "moyenne glissante" sur les 100 dernières valeurs par exemple. Cette moyenne devrait changer moins vite..
En tout cas, pour moi, c'est 10/10
14 oct. 2007 à 21:08
J'attendrai moi aussi la mise à jour :)
13 oct. 2007 à 20:26
Et bon courage pour la mise à jour de ta source...
13 oct. 2007 à 18:01
Ta méthode est très interressante, et bien plus logique au niveau de se qui se passe en mémoire en effet, c'est se que je voulait faire avec ma source, mais je m'en été juste aproché.
Je vais mettre à jour ma source avec ta méthode, j'ai constaté son efficacité avec ta source sur la chimie, c'est du joli boulot !!
13 oct. 2007 à 15:43
J'ai pour ma part déjà été confronté au scintillement, et j'ai trouvé la solution dans l'aide MSDN. Mais le mécanisme de double buffer qu'elle décrit n'est pas le même que le tien.
Ton programme utilise deux Graphics, un en liaison avec un Bitmap pour dessiner dedans, et l'autre en liaison avec la surface de la Form pour transférer l'image à l'écran.
Le mécanisme que j'avais trouvé est le suivant :
''' Initialisation :
Dim currentContext As BufferedGraphicsContext
Dim myBuffer As BufferedGraphics
currentContext = BufferedGraphicsManager.Current
myBuffer = currentContext.Allocate(Me.CreateGraphics, Me.DisplayRectangle)
myBuffer.Graphics.SmoothingMode = Drawing2D.SmoothingMode.HighQuality
''' On effectue les opérations de dessin
myBuffer.Graphics.Clear(Color.LightYellow)
myBuffer.Graphics.DrawRectangle(Pens.Blue, 10, 50, 60, 100)
''' On transfère ensuite le contenu de la mémoire tampon à l'écran
myBuffer.Render()
Je tire cet exemple d'ici :
http://msdn2.microsoft.com/fr-fr/library/b367a457(VS.80).aspx
http://msdn2.microsoft.com/fr-fr/library/ka0yazs1(VS.80).aspx
Avec ce mécanisme, on utilise vraiment une mise en mémoire tampon. C'est donc plus rapide et moins gourmand en ressources processeur.
Essaye de te pencher là dessus, mais je suis sûr que tu peux encore accélérer ton prog avec cette méthode.
11 oct. 2007 à 20:26
C'est très bien ca.
De toute facon il est bien connu que le principe de double buffering s'avere le plus efficace pour une fluidité d'animation.
Have Fun ;)
11 oct. 2007 à 19:54
11 oct. 2007 à 19:39
11 oct. 2007 à 16:14
Je viens de tester de déclencher l’événement OnPaint à partir de Panel1.Invalidate ()
mais le problème reste apparemment le même chez moi le graphique clignote toujours.
En revanche la solution pour déclencher cet événement sans que son graphique soit effacé est d'appeler l'événement en lui passant les bons paramètres:
Me.Panel1_Paint(Me, New PaintEventArgs(Viewable, New Rectangle(0, 0, Me.Panel1.Width, Me.Panel1.Height)))
J'ai mis à jour ma source avec ceci.
11 oct. 2007 à 12:02
11 oct. 2007 à 11:59
Erreur 1 Impossible d'écrire dans le fichier de sortie "obj\Debug\Double_Buffered_Panel_Exemple.Resources.resources". Le chemin d'accès spécifié, le nom de fichier ou les deux sont trop longs. Le nom de fichier qualifié complet doit comprendre moins de 260 caractères et le nom du répertoire moins de 248 caractères. Double Buffered Panel Exemple
et ce trois fois de suite, plus un plantage du Svhost au lancement de VB studio, cela sens l'archive conrompue ! Peux tu la DL et regarder cela ? merci +++
11 oct. 2007 à 08:14
mais perso je fais tout un tas de dessin dans le forms.paint et cela ne clignote pas. J'ai positionné le double buffer dans les propriétés et j'utilise un invalidate() à la place du refresh().
Conclusion, cela reste tout de même assez chaud pour un noob comme moi de trouver une méthode fiable et passe partout pour simplement faire un dessin -_-'
Merci pour ta source qui devrait me permettre d'avancer un peu. ++
10 oct. 2007 à 20:12
Pour que la demonstration ci-dessus marche il faut aussi ajouter Me.Panel1.Refresh()
a la fin du Sub Timer1.Tick
10 oct. 2007 à 20:09
Explication: au déclanchement de l'évenement OnPaint le graphique est effacer.
Le temps que l'on affiche notre image, une image toute blanche qu vien se glisser.
Cela est du au taux de rafraichisement de l'écran, le temps entre l'effacement du graphique et l'affichage de notre image éxéde le temps qu'il faut à l'écran pour afficher une image, d'ou l'image blanche.
Il est dailleur interessent de constater que plus l'instruction avant l'affichage de notre image est longue plus le temps d'affichage de l'image blanche est long.
J'espère que mon explication est compréhensible.
Tu peu t'en faire la démonsration en ajoutant le sub :
Private Sub Panel1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Panel1.Paint
e.Graphics.DrawImage(Me.BackBuffer, 0, 0)
End Sub
et en suprimant le : Viewable.DrawImageUnscaled(BackBuffer, 0, 0)
a la fin du Sub Timer1.Tick
10 oct. 2007 à 19:27
Dommage que tu ne donne pas d'exemple concret utilsant l'évènement onPaint ;)