2016-04-16 10 views
0

Ich habe eine Anwendung, in der Sie einige Formen zeichnen können, fangen sie durch Scheitelpunkte und verschieben Sie die Scheitelpunkte. Ich speichere Vertices eines Shapes in der List und zeichne die gesamte Liste der Objekte (wenn der Verticetfang und die Maus bewegt werden) in der Bitmap, die PictureBox.Image zugewiesen ist. Wenn ich mehr als 5 Formen hinzufüge, ist die bewegliche Ecke nacheilend. Hier ist ein Stück Code:Bitmap Repaint in Picturebox Lagging

private void DrawFullList() 
    { 
     if (pictureBox2.Image != null) 
     { 
      pictureBox2.Image.Dispose(); 
      g.Dispose(); 
     } 
     graphic = new Bitmap(pictureBox2.Width, pictureBox2.Height); 
     g = Graphics.FromImage(graphic); 
     pictureBox2.Image = graphic; 
     for (int i = 0; i < PointsList.Count; i++) 
      Draw(BrushList[i], PointsList[i]); 
    } 
    private void Draw(Brush brush, Point[] points) 
    { 
     Pen PathPen = new Pen(brush); 
     PathPen.Width = 3; 
     if (points.Length == 2) 
      g.DrawLine(PathPen, points[0], points[1]); 
     else 
      g.FillPolygon(brush,points); 
     pictureBox2.Image = graphic; 
    } 

Wenn es trotzdem zu verdunkeln? Ich habe versucht, graphic.Clear(Color.Transparent), aber es gab keine Möglichkeit, die Größe der Bitmap zu ändern (die Funktion wird verwendet, wenn wir die Größe des Fensters ändern).

Irgendwelche Tipps?

+0

Mögliche Duplikate von [C# WinForms - Wer weiß von einer C# GDI-Bibliothek nicht SLOW GDI +] (http://StackOverflow.com/Questions/6391911/c-sharp-winforms-anyone-know-of-ac-sharp- gdi-library-nicht-langsam-gdi) –

Antwort

0

Ich fand einen einfachen Fehler, was tatsächlich die Verzögerungen macht. pictureBox2.Image = graphic; wurde zweimal hintereinander ausgeführt, wenn PointsList.Count != 0 was laggs erstellt.

0

Ihr Code sieht zu kompliziert und unwirksam aus. Auch Ihr Code verlässt sich zu sehr auf den Garbage-Collector (es ist eine gute Praxis, die Klassen Graphics, Brush und Pen direkt nach dem Gebrauch zu entsorgen).

Ich denke, in Ihrem Fall beste Idee ist, Bitmaps vollständig zu erstellen und zu entsorgen. Sie können Ihre PictureBox durch zum Beispiel Panel Klasse ersetzen, abonnieren Sie sein Paint Ereignis und malen Sie Ihre Formen innerhalb dieser Methode. Wenn sich die Position Ihrer Scheitelpunkte ändert, rufen Sie einfach die Methode Invalidate auf, um Ihre Shapes im Panel neu zu streichen.