gpt4 book ai didi

c# - 形状与 DrawingVisual 的性能

转载 作者:太空宇宙 更新时间:2023-11-03 13:35:58 27 4
gpt4 key购买 nike

MSDN 写道:

DrawingVisual is a lightweight drawing class that is used to render shapes, images, or text. This class is considered lightweight because it does not provide layout, input, focus, or event handling, which improves its performance. For this reason, drawings are ideal for backgrounds and clip art.

我编写了一段代码,通过 Line 对象在图像上绘制千行,并通过 DrawingVisual 对象绘制千行。比较两种方式的性能我没有看到差异。在这两种情况下滚动最终图片都不够流畅。

为什么滚动延迟在每种情况下都相同?DrawingVisual 的性能优势在哪里?

第一种方式

<ScrollViewer HorizontalScrollBarVisibility="Auto" 
VerticalScrollBarVisibility="Auto">
<Canvas Background="{DynamicResource {x:Static SystemColors.ControlDarkBrushKey}}"
Name="layoutView">
<Image>
<Image.Source>
<DrawingImage>
<DrawingImage.Drawing>
<ImageDrawing x:Name="testImage"/>
</DrawingImage.Drawing>
</DrawingImage>
</Image.Source>
</Image>
</Canvas>
</ScrollViewer>

ImageSource imageSource = new BitmapImage(uri);

testImage.Rect = new Rect(
0, 0, imageSource.Width, imageSource.Height);
testImage.ImageSource = imageSource;

layoutView.Width = imageSource.Width;
layoutView.Height = imageSource.Height;

Random r = new Random();

int max = Math.Min(
(int)imageSource.Height, (int)imageSource.Width);

for (int i = 0; i < 1000; i++)
{
Point p1 = new Point(r.Next(max), r.Next(max));
Point p2 = new Point(r.Next(max), r.Next(max));

Line line = new Line();
line.X1 = p1.X;
line.Y1 = p1.Y;
line.X2 = p2.X;
line.Y2 = p2.Y;
line.Stroke = Brushes.Red;

layoutView.Children.Add(line);
}

第二种方式

<ScrollViewer HorizontalScrollBarVisibility="Auto" 
VerticalScrollBarVisibility="Auto">
<my:VisualView Background="{DynamicResource {x:Static SystemColors.ControlDarkBrushKey}}"
x:Name="layoutView">
</my:VisualView>
</ScrollViewer>

public class VisualView : Canvas
{
List<Visual> visuals = new List<Visual>();

protected override int VisualChildrenCount
{
get
{
return visuals.Count;
}
}

protected override Visual GetVisualChild(int index)
{
return visuals[index];
}

public void AddVisual(Visual visual)
{
visuals.Add(visual);
base.AddVisualChild(visual);
base.AddLogicalChild(visual);
}

public void RemoveVisual(Visual visual)
{
visuals.Remove(visual);
base.RemoveVisualChild(visual);
base.RemoveLogicalChild(visual);
}
}

ImageSource imageSource = new BitmapImage(uri);

Random r = new Random();

int max = Math.Min(
(int)imageSource.Height, (int)imageSource.Width);

DrawingVisual dv = new DrawingVisual();
using (DrawingContext dc = dv.RenderOpen())
{
dc.DrawImage(imageSource, new Rect(
0, 0, imageSource.Width, imageSource.Height));
dc.Close();

layoutView.AddVisual(dv);

layoutView.Width = imageSource.Width;
layoutView.Height = imageSource.Height;
}

Pen pen = new Pen(Brushes.Red, 1);
for (int i = 0; i < 1000; i++)
{
dv = new DrawingVisual();
using (DrawingContext dc = dv.RenderOpen())
{
Point p1 = new Point(r.Next(max), r.Next(max));
Point p2 = new Point(r.Next(max), r.Next(max));

dc.DrawLine(pen, p1, p2);
dc.Close();

layoutView.AddVisual(dv);
}
}

最佳答案

您需要仔细测量才能看到真正的差异。可能有一些 WPF ETW 事件可以提供帮助。

如果是的话,您同时拥有图像和矢量图形。如果图像在这里主导性能,那么任何一种方式都可能非常相似。

先尝试删除图片,看看是否有区别。

使用矢量,您不应该创建 1000 个 DrawingVisual,您可以将 1000 条线绘制到一个 Visual 中。您甚至可以绘制一条折线。

对于单条折线,您可以通过删除不影响线形状的点来进一步优化。

关于c# - 形状与 DrawingVisual 的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18695224/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com