簡體   English   中英

當線條相互交叉時,DrawLines 非常慢

[英]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替換xy時,性能很好。 這里的線沒有相互交叉。

我也觀察到線寬有影響。 大於 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–PeuckerVisvalingam–Whyatt來簡化您的產品線。 如果這是 plot,那么點數多於顯示器上的像素數可能沒有多大意義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM