c# - 在 WPF 中绘制基元非常慢。如何提高?

标签 c# wpf

我正在编写一个类似 CAD 的应用程序,当内容缩小时,该应用程序可能需要显示数万行。

目前我使用 C++ 和 Direct2D,它们工作得相当顺利:我可以在大约 16 毫秒内绘制 100000 条线。所以我知道我的(平均)机器可以处理这个问题。

我正在尝试迁移到 WPF,但我发现其性能令人失望。使用下面的代码,重绘需要近一秒钟(例如,当我调整窗口大小时)。

分析显示瓶颈位于 [wpfgfx_v0400.dll] 中的某个位置,但我无法确切地看到哪些函数。

所以我的问题是:我做错了什么?如何提高下面代码的性能?

public partial class MainWindow : Window
{
    public MainWindow ()
    {
        InitializeComponent ();

        var gg = new GeometryGroup ();

        Random random = new Random ();
        for (int i = 0; i < 1000; i++)
        {
            Point p0 = new Point (random.Next (1000), random.Next (1000));
            Point p1 = new Point (random.Next (1000), random.Next (1000));
            var lineGeometry = new LineGeometry (p0, p1);

            gg.Children.Add (lineGeometry);
        }

        var stroke = new SolidColorBrush (Colors.Red);

        gg.Freeze ();
        stroke.Freeze ();

        this.Content = new Path () { Data = gg, Stroke = stroke };
    }
}

最佳答案

在 WPF 中绘制内容比您预期的要慢!一般来说,具有 1000 个点的线应该不是问题,但我不希望使用 WPF 几何基元绘制接近 100000 个点的任何位置 - 相反,您最终将不得不自行光栅化或使用一些原始的嵌入的 DirectX在您的 WPF 应用程序中。

具体来说,单行 1000 点的情况应该完全在合理范围内,一些想法:

  • 对于随机数据,如果线路来回覆盖很多区域,这可能会导致一些非常难看的性能。这不仅仅是创建一个大区域来重绘的情况 - 来回似乎会导致 WPF 几何体出现一些糟糕的情况

  • 如果您要绘制一条线,请尝试使用 PolyLinePolyLineSegment在你的Path

  • 如果您确实想要一些断开的线路,而不是 GeometryGroup充满LineGeometry ,使用Path有很多PathFigure

对于其他答案指出的一般情况,您可以查看 OnRenderDrawingVisual类型方法,取决于您正在做什么,性能可能会更好,也可能不会更好。我认为您仍然会为您建议的元素数量而苦苦挣扎,除非您可以进行某种虚拟化。

关于c# - 在 WPF 中绘制基元非常慢。如何提高?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20073612/

相关文章:

c# - 如何计算 C# 中的幂?

.net - WPF数据虚拟化问题

c# - MediaPlayer 无法播放没有扩展名的文件名

c# - 使用泛型类型的可空属性的泛型类

c# - 如何在聚合之前将值转换为 long ?

c# - 如何在基类中创建对象的克隆?

c# - 在 C# 中多线程访问 WPF GUI

wpf - 绑定(bind)属性中的“自动”值 'width'

c# - WPF 如何设置 CollectionViewSource 的最大结果量

c# - 时间跨度错误..?