Vah*_*hid 5 c# wpf performance line drawingcontext
我将实时绘制数百条线。我选择了视觉层来做到这一点。但我看到这里有两种不同的画线方式。您建议使用哪一种以获得更好的性能和速度?
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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
就像我说的,你只需要一种视觉效果,在里面你可以拥有所有的线条。
看看这个:
首先,我们在绘图上下文中定义多个绘图:
class EllipseAndRectangle : DrawingVisual
{
public EllipseAndRectangle()
{
using (DrawingContext dc = RenderOpen())
{
// Black ellipse with blue border
dc.DrawEllipse(Brushes.Black,
new Pen(Brushes.Blue, 3),
new Point(120, 120), 20, 40);
// Red rectangle with green border
dc.DrawRectangle(Brushes.Red,
new Pen(Brushes.Green, 4),
new Rect(new Point(10, 10), new Point(80, 80)));
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是承载所有绘图的一种特殊视觉效果或元素:
public class EllAndRectHost : FrameworkElement
{
private EllipseAndRectangle _ellAndRect = new EllipseAndRectangle();
// EllipseAndRectangle instance is our only visual child
protected override Visual GetVisualChild(int index)
{
return _ellAndRect;
}
protected override int VisualChildrenCount
{
get
{
return 1;
}
}
}
Run Code Online (Sandbox Code Playgroud)
这就是在 XAML 中使用所有这些内容的方法:
<local:EllAndRectHost Margin="30" ... />
Run Code Online (Sandbox Code Playgroud)
我说的是您可以继承 DrawingVisual 类,而不是为 100 行创建 100 个视觉效果。
关于你的问题,第一种方法更快。因为第二种方法最终会做同样的事情,第一种方法只是包装得很好。DrawLine是最低端。你不能再深入了DrawLine。DrawGeometry正在通话DrawLine以及其他一些内部事务。
| 归档时间: |
|
| 查看次数: |
4589 次 |
| 最近记录: |