2009-07-25 14 views
2

Ich muss 100 Zeilen zwischen 100 halb zufälligen Punkten in einem Quadrat von 800x800 Pixel auf dem Bildschirm zeichnen.Notwendigkeit, auf 800 * 800-Pixel-Box auf dem Bildschirm effizient zu zeichnen

Ich habe die integrierten Zeichnungslinien verwendet & drawrecangles Funktionen innerhalb von .NET, aber meine Zeichnung wird jedes Mal gelöscht, wenn das Formular malt.

Also habe ich darüber nachgedacht, vielleicht zu einer In-Memory-Bitmap zu zeichnen, aber ich bin mir nicht sicher, ob das eine gute Lösung ist.

Irgendwelche Tipps?

Antwort

3

Nicht nur das ist eine gute Idee, sondern es hat auch einen Namen (Doppelpufferung). Zeichnen Sie auf einer Bitmap auf Formularebene und dann in dem Paint-Ereignis Ihres Formulars (eigentlich wäre es besser, dies mit einer PictureBox im Formular auszuführen, und verwenden Sie das Paint-Ereignis), verwenden Sie die DrawImage-Methode des Graphics-Objekts Bitmap in die PictureBox.

Eine einfachere Möglichkeit besteht darin, Ihre Bitmap zu erstellen, darauf zu zeichnen und dann die Bitmap als Bildeigenschaft Ihrer PictureBox festzulegen. Dadurch wird das Bild automatisch beibehalten, auch wenn das Formular neu gezeichnet wird.

2

Es ist eine gute Idee. Sie zeichnen zu einer Bitmap und die Bitmap wird in Ihrem Formular gezeichnet. Rufen Sie einfach ein Redraw (oder ein Äquivalent) auf, nachdem Sie Ihre Bitmap geändert haben.

3

Es ist keine gute Idee, vorausgesetzt die GDI + Leistung meiner Maschine ist vergleichbar. Die Form-Klasse unterstützt bereits die doppelte Pufferung durch die DoubleBuffered-Eigenschaft. Es macht einen besseren Job, als Sie tun können, vorausgesetzt, Sie tauchen nicht in P/Invoke wie es tut.

Meine Messungen:

  • 100 zufällige Linien, keine doppelte Pufferung : 68 msec
  • 100 zufällige Linien, Doppelpufferung: 2,6 msec
  • Graphics.DrawImage 800x800x32PArgb, keine Doppelpufferung, leer OnPaintBackground: 9,8 ms

Dies wird natürlich c hange, wenn du mehr als 400 Zeilen zeichnest. Um die Performance zu erhalten, die WFs Doppelpufferung Ihnen bietet, müssten Sie die BufferedGraphics-Klasse verwenden. Es ist sehr unfreundlich.

1

Sie können auf ein Bitmap zeichnen, um es dauerhaft zu machen, oder Sie können das Paint-Ereignis verwenden, um es auf dem Formular zu zeichnen.

auf einem Bitmap (Bildfeld Picture1, in diesem Beispiel) zu ziehen:

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

die Farbe Ereignis zu verwenden:

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