首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF PathGeometry更新是_SLOW_

WPF PathGeometry更新是_SLOW_
EN

Stack Overflow用户
提问于 2010-07-07 05:39:09
回答 3查看 3K关注 0票数 7

在WPF UI中,我的节点由bezier路径连接,如下所示:

可能是..。原子http://nv3wrg.blu.livefilestore.com/y1pIGBd33lCC6lF-9H0MqgnL40BdNEoEemZDENzgpEI1IL2j4B-qb3qS3WlxMSys28IjqNngR7mdfvQBnPzerf4cFJQj9VqHBh4/acurve.png?psid=1

当用户拖动一个节点时,需要实时更新连接路径.然而,我注意到了一些放缓(特别是当一个节点连接到许多其他节点,或者多个节点同时被拖动时)。我描述了它,主要的问题似乎在这里:

8cUicfOR6BwHCTntcQbQUspRAgBdKcItC0ZcEJbIWMKaYrCtDMOtCBKB4g/profile.png?psid=1

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

编辑:Mart使用StreamGeometry的解决方案以指数方式加快了它的速度;该函数远未接近瓶颈。有一点反映表明,PathGeometry在内部使用StreamGeometry,而且每次更改任何依赖项属性时,都会重新计算StreamGeometry。所以这样就可以去掉中间人了。最终结果是:

代码语言:javascript
复制
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为好奇者提供。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-07-07 07:03:36

1-我会尝试使用StreamGeometry:

代码语言:javascript
复制
        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设置点时,它将重新计算所有内容。这就是它慢的原因。当它被添加到几何学中时,速度会变慢。

试着对所有的曲线只使用一个框架元素。检查这个:编写更高效的ItemsControls

票数 7
EN

Stack Overflow用户

发布于 2010-07-07 06:00:17

如果您不需要点击测试,上下文菜单,工具提示为您的曲线,您可以使用简单的可视化,而不是框架元素。

票数 0
EN

Stack Overflow用户

发布于 2010-07-07 07:03:43

我可以想象,您的性能问题来自于从FrameworkElement下降到让WPF布局引擎在计算曲线时重新计算布局。

您可以考虑的是通过从Freezable降下来来建模曲线,然后使用FrameworkElement (如PathGeometry)来显示实际的几何图形。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3192176

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档