- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
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/
我创建自己的 FrameworkElement并覆盖 VisualChildrenCount{get;}和 GetVisualChild(int index)通过返回我自己的 DrawingVisua
我想给我的 DrawingVisual 一个模糊效果.我可以使用 BitmapEffect 来做到这一点属性如: DrawingVisual drawingVisual = new DrawingVi
我的代码在性能方面存在一些问题......我需要将多种颜色的矩形渲染到我的 DrawingVisual。 第一个版本很简单: using (DrawingContext dc = Canvas.Ren
当我使用 WPF 绘制许多简单的形状时,我不需要阻止 UI。 在 WinForms 中,我会设置后台缓冲区并绘制到后台线程上的缓冲区,然后将生成的缓冲区绘制到控件。它运作良好。 在 WPF 中,我尝试
我有一个 DrawingVisual例如,我使用此方法创建的对象: Private Function CreateDrawingVisualRectangle() As DrawingVisual
我正在开发WPF MVVM应用程序。它具有从Canvas继承的自定义 Canvas 类。有一个窗口,其中放置了一个自定义 Canvas (使用XAML),并且其背景色设置为Transaparent。使
我有一个 DrawingVisual对象,我想更改它的填充和描边。 我已经为 Fill 尝试过这个: DrawingVisual MyDrawing = new DrawingVisual(); Se
使用 Visual C# 2010,我正在尝试根据从 Windows Kinect 接收到的帧编写一个 .avi 文件。使用 BitmapEncoder 和 PngBitmapEncoder(保存到流
我有一个继承自 Canvas 的 DerivedCanvas 类。我用它来绘制几个自定义绘图视觉效果,但无法弄清楚如何将 Button 对象添加为 DrawingVisual 对象的子对象。下面是我在
MSDN 写道: DrawingVisual is a lightweight drawing class that is used to render shapes, images, or text
我正在尝试在 System.Windows.Media.DrawingVisual 中绘制一些东西,但我需要以毫米为单位绘制薄片。我该怎么做? 最佳答案 在 WPF 中,您甚至无法在不付出额外努力的情
我正在尝试实现一种算法,该算法将找到最佳比例系数和最佳角度来定位图形,使其不与容器的边缘重叠并且采用最佳角度(由图形尽可能宽的角度定义)。我正在使用 DrawingVisual来代表这个数字。 我现在
我有一个绘图视觉对象,我有绘图,如何将它添加到我的 Canvas 并显示? DrawingVisual drawingVisual = new DrawingVisual(); // Retrie
我创建了一个最小的项目,以便“开始”在 WPF 中使用 DrawingVisuals 进行绘图(到目前为止我还是初学者)。 我的项目仅包含主窗口的 XAML 和隐藏代码。该项目的唯一目的是打开一个窗口
我正在开发一个类似游戏的应用程序,它有多达一千种形状(椭圆和线条),以 60fps 的速度不断变化。阅读了 excellent article on rendering many moving sha
我正在尝试使用 MouseButtonEventHandler 在 Canvas 中添加绘图可视对象。但是无法获取点击事件。我在这里做错了什么? public class VisualHost : U
我看过几个关于在 WPF 中渲染 1 像素线的示例,但似乎没有一个适用于我的情况。我正在使用 DrawingVisual 和 DrawingContext 来绘制一些形状,并使用 RenderTarg
用例:我使用 WPF 在 Web 上下文中的图像上动态叠加文本。 解决方案: 我正在使用 DrawingContext来自 DrawingVisual (包裹在 using 语句中)绘制原始位图和覆盖
我有一个类继承了 InkCanvas 类。我覆盖了 VisualChildrenCount 属性和 GetVisualChild 方法: Visual GetVisualChild(int index
我正在 WPF 中开发一个项目,该项目每秒更新 View 高达 30 次。据我所知,我正在使用 MVVM 模式,并且对目前的结果相当满意。但是我想知道是否有更有效的方法来更新我的主机容器中 Visua
我是一名优秀的程序员,十分优秀!