Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 提高drawingvisual渲染的速度_Wpf_Performance - Fatal编程技术网

Wpf 提高drawingvisual渲染的速度

Wpf 提高drawingvisual渲染的速度,wpf,performance,Wpf,Performance,我创建自己的FrameworkElement,并通过返回自己的DrawingVisual集合实例来覆盖VisualChildrenCount{get;}和GetVisualChildIn索引。我已经覆盖了OnRender 我将在此FrameworkElement中添加20-50个DrawingVisual,每个DrawingVisual将有2000个线段。这些点的逻辑值介于0到60000之间。当我放大到1:1时,FrameworkElement的高度将为60000,渲染时间将为15分钟 如何提高

我创建自己的FrameworkElement,并通过返回自己的DrawingVisual集合实例来覆盖VisualChildrenCount{get;}和GetVisualChildIn索引。我已经覆盖了OnRender

我将在此FrameworkElement中添加20-50个DrawingVisual,每个DrawingVisual将有2000个线段。这些点的逻辑值介于0到60000之间。当我放大到1:1时,FrameworkElement的高度将为60000,渲染时间将为15分钟


如何提高渲染性能?

对于此类数据量,我建议您为每个点构建包含单个多段线的GeometryDrawing和StreamGeometry。然后将它们组合在一个DrawingGroup中,并使用单个DrawingVisual进行显示

这将是XAML:

<DrawingVisual Drawing="{Binding CurrentDrawing}" />
<DrawingVisual Drawing="{Binding CurrentDrawing}" />
如果您的数据正在更改,则最好创建并单独存储每个GeometryDrawing对象,以便只需要重新创建源数据已更改的GeometryDrawing

更新

您在评论中提到,您需要分别测试20-50个数据项中的每一个。在这种情况下,您可能确实希望对每种图形使用单独的DrawingVisual。为了获得最佳性能,您需要将RenderRopen与DrawingContext一起使用:


我需要使用hittesting来突出显示每个视觉效果。如果我用一个DrawingVisual来显示它们,我想这可能是不可能的


对于这种数据量,我建议您为每个点构建一个包含单个多段线的GeometryDrawing和StreamGeometry。然后将它们组合在一个DrawingGroup中,并使用单个DrawingVisual进行显示

这将是XAML:

<DrawingVisual Drawing="{Binding CurrentDrawing}" />
<DrawingVisual Drawing="{Binding CurrentDrawing}" />

如果您的数据正在更改,则创建并单独存储每个GeometryDrawing对象可能是有利的,因此只需重新创建源数据已更改的GeometryDrawing即可。

您好,谢谢您的回答,我将很快尝试。我需要使用hittesting突出显示每个视觉效果。如果我使用单个DrawingVisual显示它们,我认为这可能无法完成。在这种情况下,请将每个数据项放在其自己的DrawingVisual中,并使用RenderRopen和DrawingContext。我已编辑了我的答案,以说明如何完成此操作。您的更新看起来像我现有的代码。它的性能非常差。@Mackeni如果您完全错了,那么StreamGeometry比Shapes对象更高效的原因有很多。
var group = new DrawingGroup();
foreach(var data in myData)
{
  StreamGeometry geo = new StreamGeometry();
  using(geoContext = geo.Open())
  {
    geoContext.BeginFigure(myData.StartPoint, false, false);
    geoContext.PolyLineTo(myData.AdditionalPoints, true, false);
  }
  group.Add(new GeometryDrawing
  {
    Geometry = geo,
    Pen = myData.Pen,
  });
}
CurrentDrawing = group;
...