如何在0.5秒内用WPF画出数万个点?

我正在编写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); } 

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

Tamir Khason也做了这一点,并在这里更深入地介绍了Bitmap样式性能WPF。

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

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

我想代码示例是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,那么它们的规模确实不同)

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

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

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