22

我正在编写WPF代码来显示一个实时图,它是一条包含大约 10,000 个点的连接线。在我的电脑中显示一张图片大约需要 5 秒钟。有没有人想在 0.5 秒内让它更快?

class eee : FrameworkElement
{

    public eee()
    {
        _children = new VisualCollection(this);
        Random rand = new Random();
        DrawingVisual dv = new DrawingVisual();
        using (DrawingContext dx = dv.RenderOpen())
        {
            Pen drawingPen = new Pen(Brushes.Black, 1);
            double x=rand.Next(300);
            double y = rand.Next(300);
            for (double i = 0; i < 1000; i = i + 0.1)
            {
                y = 100 + rand.Next(100);
                dx.DrawLine(drawingPen, new Point(i, x), new Point(i + 1, y));
                x = y;
            }
        }
         _children.Add(dv);
    }
4

5 回答 5

38

Charles Petzold正是这样做的。在我的主机上它甚至更快(< 0.3 秒),甚至是数据绑定!;)

Tamir Khason也这样做了,这里用线条更深入地介绍了位图样式性能 WPF 。

Rico Mariani对 3D 高性能图形有一些指导,如果经过深思熟虑,基本上利用值类型可以提高您的吞吐量。

张建中给出了我最喜欢的关于这个主题的新教程,3D 散点图,数以万计的数据点动画和交互。

于 2009-07-19T14:54:19.673 回答
2

我猜代码示例是 1) 一个测试来尝试一个不是真正示例的东西或 2) 一个家庭作业。

尝试覆盖 OnRender 并执行以下操作:

Pen drawingPen = new Pen(Brushes.Black, 1);

protected override void OnRender(DrawingContext dc)
{
    dc.DrawRectangle(Background, null, new Rect(RenderSize));


            double x=rand.Next(300);
            double y = rand.Next(300);
            for (double i = 0; i < 1000; i = i + 0.1)
            {
                y = 100 + rand.Next(100);
                dc.DrawLine(drawingPen, new Point(i, x), new Point(i + 1, y));
                x = y;
            }


}

或者对于具有真实数据的东西,考虑是否真的需要根据视觉上下文的分辨率显示每个点。(如果您的比例是 0-10 并且您产生的点数是 0.0001,0.00015,那么它们在您的比例上是否真的有所不同)

于 2009-07-19T15:04:35.883 回答
1

线应该是可选择的吗?您可以在图像中画线,然后将其作为图像控件的源。它会绘制得更快,但您将失去与线条交互的能力。

于 2009-07-19T14:55:17.893 回答
0

你考虑过XNA吗?使用显卡会加快速度。

于 2009-07-19T15:01:08.540 回答
0

基于 XNA 的Monogame还活着。您可以使用它的强大功能来解决一些需要巨大图形性能的特殊任务,甚至可以在 WPF GUI 中注入它的窗口。

于 2016-05-22T11:50:28.477 回答