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

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的解决方案以指数方式加速;功能无处接近瓶颈.一点反映表明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,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);
            ctx.QuadraticBezierTo(new Point(10,10),new Point(10,i),true);
            ctx.Close();
        }
        sw.Stop();
        Console.WriteLine(sw.ElapsedMilliseconds); // For 10k it took 30 ms

它看起来比PathGeometry Pathfigure快得多.

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

2-尝试仅为所有曲线使用1个frameworkelement.检查一下:
Writing More Efficient ItemsControls

c# – WPF PathGeometry更新是_SLOW_的更多相关文章

  1. canvas 实现 github404动态效果的示例代码

    本篇文章主要介绍了canvas 实现 github404动态效果的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. android – 如何为发布和调试版本提供不同的清单文件?

    是否可以在AndroidStudio中为我的APK的调试版和发行版提供不同的清单文件?

  3. android – Gradle – 继承产品风味

    我有3种产品口味,不包括主要口味:据我了解,这些产品风格继承了main的资源,它看起来像这样:因此,当我构建xxx时,Gradle捆绑来自src/main和src/xxx文件夹的东西.现在,我需要它看起来像这样:换句话说,我希望zzz使用yyy的资源以及main的资源.Gradle可以这样做吗?id=183350创建了功能请求

  4. WPF listview / gridview性能可怕,建议

    解决方法检查这些属性:

  5. 在WPF中ListView和GridView有什么区别?

    我正在尝试创建一个WPF数据库应用程序.我可以使用一些好的组件来显示数据库表中的数据.ListView和GridView似乎很受欢迎.但对于新手来说,很难看出它们之间的区别.ListView和GridView有什么区别?优缺点都有什么?

  6. android-studio – 如何使用Gradle Experimental Plugin设置C/C++包含路径?

    当AndroidStudio位于与我的模块的主源文件夹不同的位置时,它无法找到我的头文件.#include“SDL_config.h”语句以红色突出显示.我已经尝试修改下面的cppFlags值,但我开始怀疑这些cppFlag甚至被传递给编译器.有没有人设法以这种方式包含除主要源文件夹以外的文件夹中的文件?我指定cppFlags,或者也许是moduleName甚至是源代码的方式有问题吗?

  7. href和src、link和@import的区别详解

    这篇文章主要介绍了href和src、link和@import的区别,解释了名词定义和应用场景,需要的朋友可以参考下

  8. php正则提取html图片(img)src地址与任意属性的方法

    下面小编就为大家带来一篇php正则提取html图片(img)src地址与任意属性的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  9. img的src地址是一个请求的方式来显示图片方法

    下面小编就为大家带来一篇img的src地址是一个请求的方式来显示图片方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  10. Jquery修改image的src属性,图片不加载问题的解决方法

    下面小编就为大家带来一篇Jquery修改image的src属性,图片不加载问题的解决方法。小编觉得挺不错的,现在分享给大家,也给大家做个参考,一起跟随小编过来看看吧

随机推荐

  1. c# – (wpf)Application.Current.Resources vs FindResource

    所以,我正在使用C#中的WPF创建一个GUI.它看起来像这样:它现在还没有完成.这两行是我尝试制作一种数据表,它们在XAML中是硬编码的.现在,我正在C#中实现添加新的水果按钮功能.我在XAML中有以下样式来控制行的背景图像应该是什么样子:因此,在代码中,我为每列col0,col1和col2创建一个图像,如果我使用以下代码,它添加了一个如下所示的新行:如你所见,它不太正确……为什么一个似乎忽略了一些属性而另一个没有?

  2. c# – 绑定DataGridTemplateColumn

    似乎我已经打了个墙,试图在DataGrid上使用DataTemplates.我想要做的是使用一个模板来显示每个单元格的两行文本.但是似乎无法以任何方式绑定列.以下代码希望显示我想做的事情.注意每个列的绑定:模板列没有这样的东西,因此,这个xaml不可能工作.我注定要将整个DataTemplate复制到每个列,只是对每个副本都有不同的约束?解决方法我不完全确定你想要做什么,但如果您需要获取整行的DataContext,可以使用RelativeSource绑定来移动视觉树.像这样:

  3. c# – 学习设计模式的资源

    最近我来到了这个设计模式的概念,并对此感到非常热情.你能建议一些帮助我深入设计模式的资源吗?

  4. c# – 是否有支持嵌入HTML页面的跨操作系统GUI框架?

    我想开发一个桌面应用程序来使用跨系统,是否有一个GUI框架,允许我为所有3个平台编写一次代码,并具有完全可脚本化的嵌入式Web组件?我需要它有一个API来在应用程序和网页之间进行交流.我知道C#,JavaScript和一些python.解决方法Qt有这样的事情QWebView.

  5. c# – 通过字符串在对象图中查找属性

    我试图使用任意字符串访问嵌套类结构的各个部分.给出以下(设计的)类:我想要从Person对象的一个实例的“PersonsAddress.HousePhone.Number”获取对象.目前我正在使用反思来做一些简单的递归查找,但是我希望有一些忍者有更好的想法.作为参考,这里是我开发的(crappy)方法:解决方法您可以简单地使用标准的.NETDataBinder.EvalMethod,像这样:

  6. c# – 文件下载后更新页面

    FamilyID=0a391abd-25c1-4fc0-919f-b21f31ab88b7&displaylang=en&pf=true它呈现该页面,然后使用以下元刷新标签来实际向用户提供要下载的文件:你可能需要在你的应用程序中做类似的事情.但是,如果您真的有兴趣在文件完全下载后执行某些操作,那么您的运气不佳,因为没有任何事件可以与浏览器进行通信.执行此操作的唯一方法是上传附件时使用的AJAXupload.

  7. c# – 如何在每个机器应用程序中实现单个实例?

    我必须限制我的.net4WPF应用程序,以便每台机器只能运行一次.请注意,我说每个机器,而不是每个会话.我使用一个简单的互斥体实现单实例应用程序,直到现在,但不幸的是,这样一个互斥是每个会话.有没有办法创建机器互连,还是有其他解决方案来实现每个机器应用程序的单个实例?

  8. c# – WCF和多个主机头

    我的雇主网站有多个主机名,都是同一个服务器,我们只是显示不同的皮肤来进行品牌宣传.不幸的是,在这种情况下,WCF似乎不能很好地工作.我试过overridingthedefaulthostwithacustomhostfactory.这不是一个可以接受的解决方案,因为它需要从所有主机工作,而不仅仅是1.我也看过thisblogpost,但是我无法让它工作,或者不是为了解决我的问题.我得到的错误是“这

  9. c# – ASP.NET MVC模型绑定与表单元素名称中的虚线

    我一直在搜索互联网,试图找到一种方式来容纳我的表单元素的破折号到ASP.NET的控制器在MVC2,3或甚至4中的默认模型绑定行为.作为一名前端开发人员,我更喜欢在我的CSS中使用camelCase或下划线进行破折号.在我的标记中,我想要做的是这样的:在控制器中,我会传入一个C#对象,看起来像这样:有没有办法通过一些正则表达式或其他行为来扩展Controller类来适应这种情况?我讨厌这样的事实,我必须这样做:甚至这个:思考?

  10. c# – 用户界面设计工具

    我正在寻找一个用户界面设计工具来显示文档中可能的GUI.我不能生成代码.我知道MicrosoftVisio提供了一个功能.但有什么办法吗?您使用哪种软件可视化GUI?

返回
顶部