[英]DrawLines very slow when lines are crossing each other
對於n
> 1000 的大量線條,當線條相互交叉時, Graphics.DrawLines的性能非常差(多秒)。 請參見以下示例:
private static readonly Random r = new Random();
private void Form1_Paint(object sender, PaintEventArgs e)
{
int n = 10000;
using (Pen pen = new Pen(Color.Black, 1))
{
Point[] points = new Point[n];
for (int i = 0; i < n; i++)
{
int ii = i * 1000 / n;
int x = r.Next(0, 1001);
int y = r.Next(0, 1001);
points[i] = new Point(x, y);
}
e.Graphics.DrawLines(pen, points);
}
}
當我用ii
替換x
或y
時,性能很好。 這里的線沒有相互交叉。
我也觀察到線寬有影響。 大於 1 的線寬甚至更慢。
有什么方法可以提高DrawLines
的性能嗎?
正如 Matthew Watson 所指出的,最可能的原因僅僅是您繪制了更多像素。 如果您將代碼更改為
for (int i = 0; i < n; i += 4)
{
points[i] = new Point(0, 0);
points[i+1] = new Point(1000, 1000);
points[i+2] = new Point(1000, 0);
points[i+3] = new Point(0, 1000);
}
你會反復畫一個十字架。 當我對此進行測試時,我得到大約 230 毫秒的時間來將一條 10k 段的線帶繪制到 bitmap。 這似乎完全在預期之內。 我希望您在使用雙緩沖繪制到屏幕時獲得類似的性能。
在繪制隨機點時,有時似乎會降低性能,尤其是在使用更寬的線時。 我對此的唯一解釋是它遇到了一些處理效率低得多的邊緣情況。 我建議您查看實際數據是否獲得可接受的性能,如果性能比預期的差得多,請使用所述數據發布另一篇文章。
您可能還想看看Ramer–Douglas–Peucker或Visvalingam–Whyatt來簡化您的產品線。 如果這是 plot,那么點數多於顯示器上的像素數可能沒有多大意義。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.