C # Slow Paint Event: рисование большого количества объектов - PullRequest
2 голосов
/ 02 ноября 2010

У меня есть PictureBox, он служит холстом.A List<RectangleObj> размер массива aprox 8000.

"RectangleObj" - это простой класс прямоугольника, после вызова метода Draw(Graphic g) он будет рисовать

  1. границу сg.DrawRectangle(...) и,
  2. заполните прямоугольник альфа-прозрачностью, используя g.FillRectangle(...)

В приложении Form.cs я использую pictureBox1_Paint(...) для зацикливания массива RectangleObj и вызовите метод Draw этого класса.

Вот так.

private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
    for (int i = 0; i < RectList.Count(); i++) //List<RectangleObj> count = 8000 
          RectList[i].Draw(e.Graphics);
}

Каждый раз, когда мышь нажимает на RectangleObj и перетаскивает изменение его местоположения (событие перемещения мыши), вызывается событие рисования.так как массив имеет большое количество, событие рисования не имеет достаточно времени, чтобы закончить цикл и затопляется движениями мыши.так что это делает событие Paint медленным.

Может кто-нибудь посоветовать мне, как оптимизировать эту процедуру.

Ответы [ 3 ]

3 голосов
/ 02 ноября 2010

Рассматривали ли вы рисование в растровое изображение в памяти, а затем перетаскивая его на экран?

1 голос
/ 02 ноября 2010

Здесь есть пара вещей:

  1. не рисуй во время движения. Рассчитать контур для выбранных элементов и XOR только тот контур, когда мышь перемещается. Перекрасить на MouseUp.
  2. не рисуй вещи, которые тебе не нужны. Вы можете запустить алгоритм, чтобы определить, какие прямоугольники полностью скрыты, и игнорировать их.
  3. Убедитесь, что у вас есть DoubleBuffered = true для вашего Picturebox
0 голосов
/ 02 ноября 2010

Определите, какие прямоугольники нужно перерисовать, основываясь на расположении движущегося прямоугольника и его предыдущем местоположении, и перерисовывайте только теПрикрепите картину только к тем частям, которые были признаны недействительными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...