【发布时间】:2014-04-11 20:07:41
【问题描述】:
我要实时绘制数百条线。我选择了 Visual Layer 来执行此操作。但我看到这里有两种不同的画线方式。您建议哪一个以获得更好的性能和速度?
1. DrawingContext.DrawLine
public class DrawingTypeOne : FrameworkElement
{
private readonly VisualCollection _visuals;
public DrawingTypeOne(double thickness)
{
var myPen = new Pen
{
Thickness = 1,
Brush = Brushes.White,
};
myPen.Freeze();
_visuals = new VisualCollection(this);
var drawingVisual = new DrawingVisual();
using (var dc = drawingVisual.RenderOpen())
{
dc.DrawLine(myPen, new Point(0,0) , new Point(100,100));
_visuals.Add(drawingVisual);
}
}
protected override Visual GetVisualChild(int index)
{
return _visuals[index];
}
protected override int VisualChildrenCount
{
get
{
return _visuals.Count;
}
}
}
2。流几何
public class DrawingTypeTwo : FrameworkElement
{
private readonly VisualCollection _visuals;
public DrawingTypeTwo()
{
_visuals = new VisualCollection(this);
var geometry = new StreamGeometry();
using (var gc = geometry.Open())
{
gc.BeginFigure(new Point(0, 0), true, true);
gc.LineTo(new Point(100,100), true, false);
}
geometry.Freeze();
var drawingVisual = new DrawingVisual();
using (var dc = drawingVisual.RenderOpen())
{
dc.DrawGeometry(Brushes.Red, null, geometry);
}
_visuals.Add(drawingVisual);
}
protected override Visual GetVisualChild(int index)
{
return _visuals[index];
}
protected override int VisualChildrenCount
{
get
{
return _visuals.Count;
}
}
}
【问题讨论】:
-
为什么不同时尝试它们并回答您自己的问题?
-
如何将控件的内容设置为来自 StreamGeometry 的 PathFigure?
-
@Vahid 是的,理论上,它比路径信息轻,因为它不支持某些相同的功能集。
-
@Vahid 是的,批量绘图应该有帮助。一般来说,几百行在 WPF 中很容易绘制,但是,无论您如何绘制,都可能不会成为问题。我不会过多地关注优化它,直到/除非它是一个问题。
-
如果您想要性能,请不要为 100 行创建 100 个视觉效果。只需创建一个视觉对象并在其中绘制这 100 条线。 WPF 将缓存您的绘图,因此您不需要从 FrameworkElement 继承。此外,这就是您将如何获得无需测量的视觉效果并安排支持,这也将为您节省大量时间。
标签: c# wpf performance line drawingcontext