2009-07-25 7 views
2

J'ai besoin de dessiner 100 lignes entre 100 points semi-aléatoires dans un carré de 800x800 pixels sur l'écran.Besoin de dessiner à la boîte de 800 * 800 pixels à l'écran efficacement

J'ai utilisé les fonctions de draw decangles drawlines intégrées à drawlines dans .NET, mais mon dessin est effacé chaque fois que le formulaire peint. Donc, je pensais à dessiner dans un bitmap en mémoire, mais je ne suis pas sûr que ce soit une bonne solution.

Des conseils?

Répondre

3

Non seulement c'est une bonne idée, mais elle a aussi un nom (double buffering). Dessinez sur un bitmap de niveau formulaire, puis dans l'événement Paint de votre formulaire (en fait, il serait préférable de le faire avec un PictureBox sur le formulaire et d'utiliser son événement Paint) utilisez la méthode DrawImage de l'objet Graphics pour dessiner votre Bitmap dans le PictureBox.

Une manière plus simple consiste simplement à créer votre bitmap, à dessiner dessus, puis à définir le bitmap en tant que propriété Image de votre PictureBox. Cela va automatiquement persister l'image même lorsque votre formulaire est repeint.

2

C'est une bonne idée. Vous dessinez sur une image bitmap et l'image bitmap est dessinée dans votre formulaire. Appelez simplement un redessin (ou équivalent) après avoir modifié votre bitmap.

3

Ce n'est pas une bonne idée, en supposant que les performances de mon appareil GDI + soient comparables. La classe Form prend déjà en charge la double mise en mémoire tampon via la propriété DoubleBuffered. Il fait un meilleur travail que vous pouvez le faire, en supposant que vous ne plongez pas dans P/Invoke comme il le fait.

Mes mesures:

  • 100 lignes aléatoires, pas de double tampon: 68 msec
  • 100 lignes aléatoires, double tampon: 2,6 msec
  • Graphics.DrawImage 800x800x32PArgb, pas de double tampon, vide OnPaintBackground: 9,8 msec

Ce sera bien sûr c changer quand vous dessinez plus de 400 lignes. Pour obtenir le perf que le double tampon de WF vous donne, vous devez utiliser la classe BufferedGraphics. C'est très hostile.

1

Vous pouvez dessiner sur un bitmap pour le rendre persistant, ou vous pouvez utiliser l'événement paint pour le dessiner sur le formulaire.

Pour dessiner sur un bitmap (zone d'image Picture1, dans cet exemple):

dim g as graphics 
g = Graphics.FromImage(Picture1.Image) 
g.DrawRectangle(...) 

Pour utiliser l'événement de peinture:

Private Sub Form1_Paint(ByVal sender As Object, ByVal e As PaintEventArgs) Handles Me.Paint 
e.Graphics.DrawRectangle(...) 
end sub 
Questions connexes