我有一個動態列表點,新點可以隨時添加。我想畫線以使用不同的顏色來連接它們。顏色是基於這些點的指數。這裏是代碼:使用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