gpt4 book ai didi

c# - WPF PathGeometry 更新速度_SLOW_

转载 作者:太空狗 更新时间:2023-10-29 20:22:23 26 4
gpt4 key购买 nike

在 WPF UI 中,我有通过贝塞尔曲线路径连接的节点,如下所示:

It might be... atomic http://nv3wrg.blu.livefilestore.com/y1pIGBd33lCC6lF-9H0MqgnL40BdNEoEemZDENzgpEI1IL2j4B-qb3qS3WlxMSys28IjqNngR7mdfvQBnPzerf4cFJQj9VqHBh4/acurve.png?psid=1

当用户拖动节点时,连接路径需要实时更新。但是,我注意到速度有所下降(特别是如果一个节点连接到许多其他节点,或者同时拖动多个节点)。我对其进行了分析,主要问题似乎出在这里:

Proof I actually used a profiler, so please don't be all like "OMG, premature opiumzation; you are DEMON!!" http://nv3wrg.blu.livefilestore.com/y1pjRfQYuN57yei5qdUxW4Dlh4vVCzPy8TcfEzlw_8cUicfOR6BwHCTntcQbQUspRAgBdKcItC0ZcEJbIWMKaYrCtDMOtCBKB4g/profile.png?psid=1

这是每次更改源或目标属性时调用的函数。每次任何控制点发生变化时,构成路径的几何形状似乎都会在内部重新生成。也许是否有一种方法可以防止在设置所有相关依赖属性之前重新生成几何图形?

编辑: Mart 使用 StreamGeometry 的解决方案以指数方式加速;该功能远未达到瓶颈。一点反射(reflect)表明 PathGeometry 在内部使用 StreamGeometry,并且每次更改任何依赖属性时,都会重新计算 StreamGeometry。所以这种方式只是省去了中间商。最终结果是:

private void onRouteChanged()
{
Point src = Source;
Point dst = Destination;
if (!src.X.isValid() || !src.Y.isValid() || !dst.X.isValid() || !dst.Y.isValid())
{
_shouldDraw = false;
return;
}

/*
* The control points are all laid out along midpoint lines, something like this:
*
* --------------------------------
* | | | |
* | SRC | CP1 | |
* | | | |
* --------------------------------
* | | | |
* | | MID | |
* | | | |
* -------------------------------
* | | | |
* | | CP2 | DST |
* | | | |
* --------------------------------
*
* This causes it to be horizontal at the endpoints and vertical
* at the midpoint.
*/

double mx = (src.X + dst.X) / 2;
double my = (src.Y + dst.Y) / 2;
Point mid = new Point(mx, my);
Point cp1 = new Point(mx, src.Y);
Point cp2 = new Point(mx, dst.Y);

_geometry.Clear();
_shouldDraw = true;
using(StreamGeometryContext ctx = _geometry.Open())
{
ctx.BeginFigure(src, false, false);
ctx.QuadraticBezierTo(cp1, mid, true, false);
ctx.QuadraticBezierTo(cp2, dst, true, false);
}
}

该项目的完整源代码可在 http://zeal.codeplex.com 获得。对于好奇。

最佳答案

1- 我会尝试使用 StreamGeometry:

        StreamGeometry streamGeo = new StreamGeometry();
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i < 10000; i++)
{
streamGeo.Clear();
var ctx = streamGeo.Open();
ctx.BeginFigure(new Point(0, 0), false, false);
ctx.QuadraticBezierTo(new Point(10, 10), new Point(10, i), true, true);
ctx.Close();
}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds); // For 10k it took 30 ms

看起来比PathGeometry+PathFigure快多了。

当您为 QuadraticBezierSegment 设置点时,它会重新计算所有内容。这就是为什么它很慢。当它已经添加到几何体中时会更慢。

2- 尝试对所有曲线仅使用 1 个框架元素。检查这个: Writing More Efficient ItemsControls

关于c# - WPF PathGeometry 更新速度_SLOW_,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3192176/

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