1

画面にポイントを描く機能があります。この関数は、で行を追加するまで非常にうまく機能しましたpanelGraphics.RotateTransform。この線がある場合、1回の再塗装を行うプロセスは非常に長くなります。私のポイントのリストには約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();
}
4

1 に答える 1

2

その理由は、各長方形を回転させる必要があるためです。特に正方形の角度がない場合、回転は遅い操作になる可能性があります。

この場合のより良いアプローチは、最初に長方形を描画する「隠し」ビットマップを作成することです。次に、回転をメイングラフィックスオブジェクトに適用し、非表示のビットマップをメインビットマップ(コントロール)に描画します。このようなもの -

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();
}
于 2012-12-17T17:04:49.070 に答える