2016-04-16 2 views
0

У меня есть приложение, в котором вы можете рисовать некоторые фигуры, ловить их по вершинам и перемещать вершину. Я храню вершины фигур в List и перерисовывает весь список объектов (когда вершина поймает и перемещает мышь) в растровом изображении, которое назначено PictureBox.Image. Когда я добавляю более 5 фигур, движущаяся вершина отстает. Вот фрагмент кода: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; 
    } 

Если это так, чтобы его вставить? Я пытался установить graphic.Clear(Color.Transparent), но изменить размер растрового изображения не удалось (функция используется при изменении размера окна).

Любые советы?

+0

Возможный дубликат [C# WinForms - Любой, кто знает библиотеку C# C#, не SLOW GDI +] (http://stackoverflow.com/questions/6391911/c-sharp-winforms-anyone-know-of-ac-sharp- GDI-библиотека-не-медленно ИГРЫ) –

ответ

0

Я нашел простую ошибку, что на самом деле делает задержки. pictureBox2.Image = graphic; был выполнен два раза подряд, когда PointsList.Count != 0 что создавал лагги.

0

Ваш код выглядит сложным и неэффективным. Также ваш код слишком сильно полагается на сборщик мусора (рекомендуется использовать классы Graphics, Brush и Pen сразу после использования).

Я думаю, что в вашем случае лучшая идея заключается в том, чтобы полностью не создавать и удалять растровые изображения. Вы можете заменить PictureBox классом Panel, подписаться на его событие Paint и нарисовать фигуры внутри этого метода. Когда положение ваших вершин изменяется, просто вызовите метод Invalidate, чтобы перекрасить ваши фигуры внутри панели.