我有一个动态列表点,新点可以随时添加。我想画线以使用不同的颜色来连接它们。颜色是基于这些点的指数。这里是代码:使用GDI +使用不同颜色画线的快速方法?
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]);
}
}
我发现这种方法是不够快,当我有新的点高速进来。有什么办法可以让它更快吗?我做了一些研究,有人说使用GraphicsPath可能会更快,但是如何?
[更新]我收集了一些可能的优化:
- 使用GrahpicsPath,Original Question
- 更改图形质量(如SmoothingMode/PixelOffsetMode ......),也叫setClip的指定只在必要地区渲染。
缓存旧点是一个好主意,但是,我可以简单地更改已绘制线的颜色吗?如果不是的话,我仍然必须每次绘制所有80行。 – 2010-01-14 08:18:29
如果您的线条颜色少于256线,那么您可以在8bpp位图上使用调色板循环(因此您可以用独特的颜色绘制每条线,然后只更新调色板以重新显示颜色变化的线)。 – 2010-01-14 13:04:42
或者,您可能只能重新渲染每帧中改变颜色的线条。请注意,这将导致他们透支所有其他线路,因此您可能会在它们重叠的地方出现不需要的“深度”故障(错误的线路出现在“前面”) - 但是您可能能够避开它。如果您使用抗锯齿渲染线条,它也可能会生成奇怪的颜色,因为每条线将与其后面的颜色(包括同一线条的旧颜色)进行混合。但你可以尝试一下,看看你对结果是否满意...... – 2010-01-14 13:05:28