使用GDI +使用不同颜色绘制线条的快捷方法?

AZ.*_*AZ. 4 .net c# gdi+

我有一个动态List of Point,可以随时添加新Point.我想绘制线条以使用不同的颜色连接它们.颜色基于这些点的索引.这是代码:

    private List<Point> _points;
    private static Pen pen1 = new Pen(Color.Red, 10);
    private static Pen pen2 = new Pen(Color.Yellow, 10);
    private static Pen pen3 = new Pen(Color.Blue, 10);
    private static Pen pen4 = new Pen(Color.Green, 10);

    private void Init()
    {
        // use fixed 80 for simpicity
        _points = new List<Point>(80);

        for (int i = 0; i < 80; i++)
        {
            _points.Add(new Point(30 + i * 10, 30));
        }
    }

    private void DrawLinesNormal(PaintEventArgs e)
    {
        for (int i = 0; i < _points.Count-1; i++)
        {
            if (i < 20)
                e.Graphics.DrawLine(pen1, _points[i], _points[i + 1]);
            else if (i < 40)
                e.Graphics.DrawLine(pen2, _points[i], _points[i + 1]);
            else if (i < 60)
                e.Graphics.DrawLine(pen3, _points[i], _points[i + 1]);
            else
                e.Graphics.DrawLine(pen4, _points[i], _points[i + 1]);
        }
    }
Run Code Online (Sandbox Code Playgroud)

当我有新的高速进入时,我发现这种方法不够快.有没有办法让它更快?我做了一些研究,有人说使用GraphicsPath可能会更快,但如何?

[更新]我收集了一些可能的优化:

  1. 使用GrahpicsPath,原始问题
  2. 更改图形质量(例如SmoothingMode/PixelOffsetMode ...),也调用SetClip指定要渲染的唯一必要区域.

Jas*_*ams 5

在不降低质量或更改为更快的渲染器(GDI,OpenGL,DirectX)的情况下,您将无法从代码中挤出更多的速度.但是GDI通常会快得多(可能是2倍),而DirectX/OpenGL可以更快(可能是10倍),这取决于你绘制的内容.

使用Path的想法是将许多(在您的示例中为20行)行批处理为单个方法调用,而不是将DrawLine调用20次.如果您可以将传入数据排列为绘图例程的正确列表格式,这将使您受益.否则,您将必须将点复制到正确的数据结构中,这将浪费您通过批处理路径获得的大量时间.对于DrawPath,您可能必须从点数组创建GraphicsPath,这可能导致没有时间保存.但是如果你不得不多次绘制相同的路径,你可以缓存它,然后你可以看到净收益.

如果将新点添加到列表中,但不删除旧点(即,您始终只是向显示添加新行),那么您将能够使用屏幕外位图来存储到目前为止渲染的线.这样,每次添加一个点时,都会绘制一条线,而不是每次都绘制所有80条线.

这完全取决于你想要做什么.