gpt4 book ai didi

wpf - 提高绘图视觉渲染的速度

转载 作者:行者123 更新时间:2023-12-02 09:46:33 25 4
gpt4 key购买 nike

我创建自己的 FrameworkElement 并通过返回我自己的 DrawingVisual 集合实例来重写 VisualChildrenCount{get;} 和 GetVisualChild(int index) 。我已经重写了 OnRender 。

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

如何提高渲染性能?

最佳答案

对于这种数据量,我建议您构建一个 GeometryDrawing 和 StreamGeometry,其中为每个点包含一条 PolyLine。然后将它们全部组合到一个 DrawingGroup 中,并使用单个 DrawingVisual 显示它。

这将是 XAML:

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

这将是更新 CurrentDrawing 的代码:

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;
...

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

更新

您在评论中提到您需要分别对 20-50 个数据项进行 HitTest 。在这种情况下,您可能确实希望为每个对象使用单独的 DrawingVisual。为了获得最大性能,您需要将 RenderOpen()DrawingContext 一起使用:

IEnumerable<Visual> BuildVisuals()
{
return
from var data in myData
select BuildVisualForData(data);
}

void BuildVisualForData(MyDataType data)
{
var geo = new StreamGeometry();
using(geoContext = geo.Open())
{
geoContext.BeginFigure(myData.StartPoint, false, false);
geoContext.PolyLineTo(myData.AdditionalPoints, true, false);
}

var visual = new DrawingVisual();
using(drawingContext = visual.RenderOpen())
{
drawingContext.DrawGeometry(null, myData.Pen, geo);
}
return visual;
}

关于wpf - 提高绘图视觉渲染的速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1755520/

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