RotateTransform замедляет функцию FillRectangle в C# GDI+?
У меня есть функция, которая рисует точки на экране. Эта функция работала очень хорошо, пока я не добавил строку с panelGraphics.RotateTransform
, Когда эта строка есть, процесс перерисовки очень длинный. Мой список точек содержит около 5000 точек, и без поворота это делается за пару миллисекунд, но с этой линией это может занять до 500 мс, что ОЧЕНЬ медленно. У вас есть идея, почему RotateTransform такой медленный, а также, что я могу сделать, чтобы оптимизировать это?
private void panel1_Paint(object sender, PaintEventArgs e)
{
Pen myPen = new System.Drawing.Pen(System.Drawing.Color.Red);
SolidBrush myBrush = new System.Drawing.SolidBrush(System.Drawing.Color.Red);
Graphics panelGraphics = panel1.CreateGraphics();
panelGraphics.TranslateTransform((panel1.Width / 2) + _panW, (panel1.Height / 2) + _panH);
//Problematic line...
panelGraphics.RotateTransform(230 - Convert.ToInt32(_dPan), System.Drawing.Drawing2D.MatrixOrder.Prepend);
PointF ptPrevious = new PointF(float.MaxValue, float.MaxValue);
foreach (PointF pt in _listPoint)
{
panelGraphics.FillRectangle(myBrush, (pt.X / 25) * _fZoomFactor, (pt.Y / 25) * _fZoomFactor, 2, 2);
}
myBrush.Dispose();
myPen.Dispose();
panelGraphics.Dispose();
}
1 ответ
Причина в том, что каждый прямоугольник должен быть повернут. Вращение может быть медленной операцией, особенно при отсутствии прямоугольных углов.
В этом случае лучше всего создать "скрытое" растровое изображение, в которое вы рисуете прямоугольники. Затем примените вращение к основному графическому объекту и нарисуйте скрытое растровое изображение на своем основном растровом изображении (элемент управления). Что-то вроде этого -
private void panel1_Paint(object sender, PaintEventArgs e)
{
Pen myPen = new System.Drawing.Pen(System.Drawing.Color.Red);
SolidBrush myBrush = new System.Drawing.SolidBrush(System.Drawing.Color.Red);
Graphics panelGraphics = e.Graphics; //use the provided Graphics object
// create an internal bitmap to draw rectangles to
Bitmap bmp = new Bitmap(this.ClientSize.Width, _
this.ClientSize.Height, _
Imaging.PixelFormat.Format32bppPArgb);
using (Graphics g = Graphics.FromImage(bmp)) {
PointF ptPrevious = new PointF(float.MaxValue, float.MaxValue);
foreach (PointF pt in _listPoint) {
g.FillRectangle(myBrush, (pt.X / 25) * _fZoomFactor, _
(pt.Y / 25) * _fZoomFactor, 2, 2);
}
}
panelGraphics.TranslateTransform((panel1.ClientSize.Width / 2) + _panW, _
(panel1.ClientSize.Height / 2) + _panH);
//Problematic line...
panelGraphics.RotateTransform(230 - Convert.ToInt32(_dPan), _
System.Drawing.Drawing2D.MatrixOrder.Prepend);
panelGraphics.DrawImage(bmp, 0, 0); //adjust x/y as needed
bmp.Dispose;
myBrush.Dispose();
myPen.Dispose();
}