C#:为什么画得慢?

时间:2010-11-09 13:00:39

标签: c# drawing gdi+

我通过绘制颜色变化的线条手动绘制线性渐变。然而,这是非常缓慢的,当我调整窗口大小时,我似乎更新了。我如何让它更快?在这个例子中,色标是线性的,但后来我不想做出非线性渐变。

protected override void OnPaintBackground(PaintEventArgs paintEvnt)
        {
            SuspendLayout();

            // Get the graphics object
            Graphics gfx = paintEvnt.Graphics;
            // Create a new pen that we shall use for drawing the line

            // Loop and create a horizontal line 10 pixels below the last one
            for (int i = 0; i <= 500; i++)
            {
                Pen myPen = new Pen(Color.FromArgb(i/2,0,0));
                gfx.DrawLine(myPen, 0, i, 132, i);
            }

            ResumeLayout();

        }

4 个答案:

答案 0 :(得分:3)

如果你只想绘制一次而不调整大小,我建议你把它写一次Bitmap对象,然后将这个位图绘制到背景中。此外,您可以在窗体上启用双缓冲。这应该是一个名为DoubleBuffering的属性,或类似的东西。这可以减少重绘表单时的闪烁。

答案 1 :(得分:3)

问题是GDI +非常慢。

您应该使用GDI +的高级构造,这些构造相对较快(相对于您现在所做的绘制线)。有关例如http://msdn.microsoft.com/en-us/library/system.drawing.drawing2d.lineargradientbrush.aspx的详情,请参阅{{3}} LinearGradientBrush。这些刷子和钢笔中有更多可以帮助您提高性能。

还有一件事:Suspend/ResumeLayout在你的例子中没有做任何事情。这些方法仅适用于您通过以下方式进行布局时:将Control添加到当前表单或更改现有Control的属性,例如Dock属性或HeightWidth

答案 2 :(得分:1)

您可以预先计算颜色值,这样您就不必在每次重绘时都这样做。除此之外,如果不采用更低级别的API(如XNA),你可以做的更多。

更新:在WinForms控件中托管XNA是完全可行的。在this question中有一些很好的链接。

答案 3 :(得分:0)

或许指定一个ColorBlend与Pieter建议的LinearGradientBrush一起使用,可以解决您对将来能够绘制非线性渐变的担忧吗?

您可以创建一个ColorBlend对象,指定您选择的颜色和每个颜色的任意位置。通过将InterpolationColors的{​​{1}}属性设置为LinearGradientBrush对象,您应该能够获得所需的任何效果。

MSDN提供以下示例:

ColorBlend