none
Toolkit Chart的图像载入效率能否优化 RRS feed

  • 问题

  • 用Toolkit Chart做图像绘制,假设需要载入的点有一千多个,用LineSeries样式进行绘制,每幅图绘制时间约需要3s,如果去除掉点的样式,绘制时间大概可以到0.8s,但于操作而言,还是有卡一下的感觉出现。对比了一下其他一些用winform做的程序,他们绘制同等数量级图像的时间几乎可以忽略不计,对比了两者的图像生成,有如下差别:

    WPF Toolkit Chart

    其他程序图像:

    貌似他们在绘制连续曲线的时候,是采用了近似的方法,对比前边点的样式对载入效率的影响,我想也许这种图像绘制方式是导致效率差异的一个主要地方。通过何种思路可能在Toolkitchart中也达到这样的效率呢?

    Toolkit Chart绘制折线图的XAML:

    <Window x:Class="LoadLine2.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:dc="clr-namespace:System.Windows.Controls.DataVisualization.Charting;assembly=System.Windows.Controls.DataVisualization.Toolkit"
            xmlns:dv="clr-namespace:System.Windows.Controls.DataVisualization;assembly=System.Windows.Controls.DataVisualization.Toolkit"
            xmlns:cp="clr-namespace:System.Windows.Controls.DataVisualization.Charting.Primitives;assembly=System.Windows.Controls.DataVisualization.Toolkit" 
            Title="MainWindow" Height="350" Width="525">
        <Window.Resources>
            <Style x:Key="MyDataPointStyle" TargetType="dc:LineDataPoint">
                <Setter Property="Background" Value="Blue"/>
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="dc:LineDataPoint"/>
                    </Setter.Value>
                </Setter>
            </Style>
        </Window.Resources>
        <Grid>
            <dc:Chart Name="toolkitChart" Background="Transparent">
                <dc:Chart.Series>
                    <dc:LineSeries Name="LineCreate"
                                   ItemsSource="{Binding}"
                                   IndependentValueBinding="{Binding X}"
                                   DependentValueBinding="{Binding Y}"
                                   DataPointStyle="{StaticResource MyDataPointStyle}">
                    </dc:LineSeries>
                </dc:Chart.Series>
            </dc:Chart>
            <Button Content="Load" Height="27" Margin="19,13,0,0" Name="loadBtn" Width="71" Click="loadBtn_Click" />
        </Grid>
    </Window>

    2012年9月10日 2:33

答案

全部回复

  • 简单用winform画一个chart,随机生成1000个点去画折现图,加载时间到10ms都不觉得卡,wpf能否也有这样的效率呢
    2012年9月11日 1:20
  • 查看wpf toolkit的源代码知道,LineSeries的线条画法是直接调用PolyLine这连续曲线的画法而成的,如果不使用PolyLine进行绘线(从上边第一副放大的图像看,polyline画的线有的尖有的平有的斜,感觉其在处理上有点怪异)能够如何重载这个画线方法呢
    2012年9月11日 1:44
  • 图像载入的效率会否受到绑定方式的影响,例如这里用的是

    LineCreate.ItemsSource = value;
    的方式进行绑定,这种方式会否也影响到效率呢?

    2012年9月11日 3:42
  • PolyLine继承于shape对象,而Shape对象派生于FrameworkElement类,在WPF中,绘图有Drawing和Shape两种方式,而Shape方式占用的资源相比Drawing而言要大得多,如果采用Drawing方式重载LineSeries的画线模块,可行性多大呢?
    2012年9月11日 3:47
  • 你好,wanto_com

    在中文资料中很少能看到这类WPF Toolkit Chart performance的文章,所以我找到下面这篇英文blog,给出了几点可以优化WPF Chart performance的Tips 并包含例子程序,你可以下载以作参考, http://blogs.msdn.com/b/delay/archive/2010/01/13/i-feel-the-need-the-need-for-speed-seven-simple-performance-boosting-tweaks-for-common-silverlight-wpf-charting-scenarios.aspx

    希望对你有所帮助。


    Annabella Luo[MSFT]
    MSDN Community Support | Feedback to us

    2012年9月11日 6:27
    版主
  • 谢谢, 确实不少方法是有用的,例如去掉样式、设定固定坐标等,不过效率的问题似乎是WPF自己的问题,文中也提到,官方建议图表处理的点在1000个以下,刚好我的点的数量需要到达1000个,所以就会有点卡。

    有一个疑惑的地方,文中提到的ObservableCollection的一个加载优化,我理解的意思是当首次加载点的时候,为了不要频繁的触发通知机制,于是作者采用AddRangeObservableCollection来一次性通知,不知道是不是这个意思,如果是的话,我感觉前后的差别应该会比较大。但在实际使用中似乎没感觉出多大的差别呢

    2012年9月12日 3:01
  • 你好,

    我认为你的理解是正确的,在loading的时候以减少Inotification触发的次数来使Chart实现一次性加载。但是ObservableCollection是一个可以自动完成INotification的数据类型,在文档中的AddRangeObservableCollection方法中,在添加所有的Item到Collection中后作者手动的触发了Notification的机制,但是这并没能阻止在添加每个Item到ObservableCollection中时其自动触发的Notification机制。就是说,你可能需要使用List<object>这样的数据类型,在其中添加手动Notification的机制来达到这样的目的。

    希望我的理解对你有所帮助。


    Annabella Luo[MSFT]
    MSDN Community Support | Feedback to us

    2012年9月13日 7:02
    版主