LiveCharts WPF渲染性能差

5
我正在构建一个WPF工具,用于可视化冷藏集装箱(冷藏集装箱)的数据。这是传感器数据(温度、设定点、湿度)的简单绘图。
问题在于渲染性能。通过REST API加载数据非常快。将值重新格式化为DateTimePoints后(需要1ms),它们作为齿轮值设置在绑定的SeriesCollection上。在设置完值之后,应用程序会立即冻结10秒钟,以不流畅的方式呈现图表,整个应用程序都无法使用。我尝试了所有的示例和演示文稿,但我无法让LiveCharts以可用的方式运行,我不知道我在这里做错了什么。

CartesianChart
3x GStepLineSeries,每个系列有626个值
XAxisFormatter DateTimePoint

我不知道我做错了什么。1900个齿轮值太多了吗?LiveCharts很糟糕吗?

CartesianChart GStepLineSeries enter image description here

 public GStepLineSeries SupplyTemperatures
    {
        get { return _supplyTemperatures ?? (_supplyTemperatures = new GStepLineSeries() { Title = "Supply" }); }
        set
        {
            _supplyTemperatures = value;
            RaisePropertyChanged();
        }
    }

    public GStepLineSeries ReturnTemperatures
    {
        get { return _returnTemperatures ?? (_returnTemperatures = new GStepLineSeries { Title = "Return" }); }
        set
        {
            _returnTemperatures = value;
            RaisePropertyChanged();
        }
    }

    public GStepLineSeries Setpoints
    {
        get
        {
            return _setpoints ?? (_setpoints = new GStepLineSeries
            {
                Title = "Setpoint",
                Fill = Brushes.Transparent,
                PointGeometry = null
            });
        }
        set
        {
            _setpoints = value;
            RaisePropertyChanged();
        }
    }

    public SeriesCollection ReeferDataTemperatureSeries
    {
        get
        {
            if (_reeferDataTemperatureSeries == null)
            {
                _reeferDataTemperatureSeries =
                    new SeriesCollection(GetSeriesConfig()) { SupplyTemperatures, ReturnTemperatures, Setpoints };

            }

            return _reeferDataTemperatureSeries;
        }
        set
        {
            _reeferDataTemperatureSeries = value;
            RaisePropertyChanged();
        }
    }

    private CartesianMapper<DateTimePoint> GetSeriesConfig()
    {
        return Mappers.Xy<DateTimePoint>()
            .X(rdcv => (double)rdcv.DateTime.Ticks)
            .Y(rdcv => rdcv.Value);
    }

Xaml:

     <lvc:CartesianChart
                                Height="800"
                                DisableAnimations="True"
                                IsManipulationEnabled="False"
                                LegendLocation="Top"
                                Series="{Binding ReeferDataTemperatureSeries}">

                                <lvc:CartesianChart.AxisX>
                                    <lvc:Axis
                                        Title="Time"
                                        LabelFormatter="{Binding ReeferDataFormatter}"
                                        RangeChanged="Axis_OnRangeChanged"
                                        Separator="{x:Static lvc:DefaultAxes.CleanSeparator}" />
                                </lvc:CartesianChart.AxisX>
                                <lvc:CartesianChart.AxisY>
                                    <lvc:Axis Title="Temperature" />
                                </lvc:CartesianChart.AxisY>
                            </lvc:CartesianChart>

你尝试过对你的应用进行性能分析吗?哪些方法消耗了最多的 CPU 时间? - dymanoid
1
相关:Live Charts性能技巧 - Nick Alexeev
4个回答

4

通过进行一些更改,我能够在每个系列中有1,000个数据点的情况下,在大约1.5秒内绘制出图形。

  • 在图表上将“Hoverable”设置为false
  • 使所有系列上的点几何图形为空

我的代码版本也使用了标准图表而不是齿轮版本,因为我没有许可证,所以对您来说可能会更快。


1
我也遇到了这个问题,解决方法是:
SeriesCollection[0].Values = chartvalues.AsGearedValues().WithQuality(Quality.High)
当然,Quality是可选的。即使有20万个点,我现在也没有渲染问题了。在我的示例中,chartvalues是ChartValues。只要我没有使用asgearedvalues,它就不起作用,因为它显示了它是齿轮集合,应该没问题。

-1
免费的LiveCharts性能非常差。如果您想显示几十个数据点,甚至几百个数据点都还好。如果您需要展示大量数据,则需要高性能,而Geared就是解决方案。我从免费版开始使用,但在约1000个点后,UI停止更新且CPU使用率达到40%,即使禁用动画,悬停和工具提示也是如此。唯一有帮助的是将`PointGeometry`设置为`null`。这解决了性能问题,但同时也去除了点的圆形,这是不可接受的。
然后我尝试了Geared,即使有成千上万的点,开启悬停、工具提示和默认的PointGeometry,速度和性能也非常出色(仅使用1%的CPU)。我继续禁用动画并将质量设置为低。Geared非常快速、轻量级、漂亮且功能丰富,真是太棒了。只需99美元,它就像没有花费一样。特别是与SciChart相比,后者的价格高出10倍。我对LiveCharts和Geared唯一的担忧是缺乏积极的开发。它们都在2018年进行了最后更新,而Beto似乎已经消失了。Geared如此出色,如果该项目被放弃,那将是非常悲伤的。再次强调,99美元的库对于这样一个库来说不算什么。

仅售99美元,价格几乎可以忽略不计...但我的担忧是缺乏积极的开发。嗯,这是一个相当大的问题。 - Dr. Andrew Burnett-Thompson
是的,这就是我的观点。这样一个价格的库非常棒,但它需要得到积极的开发。否则,价格不会有所帮助,而错误将毁掉它。 - Steve

-5

很遗憾,WPF的开源图表性能不是很好。如果您想实现更高的点数和实时更新,则可能需要考虑商业图表。

我想建议我的组件SciChart作为一个潜在的解决方案。是的,它是商业化的,我会透露我是所有者,但它确实可以通过为您提供卓越的性能框架(数百万个点,毫秒级更新)来解决WPF图表缓慢的问题。它还具有MVVM支持,并且功能齐全。

如果您有时间,请查看一下,网址是https://www.scichart.com/wpf-chart-features

页面上可以找到特定的性能演示https://www.scichart.com/why-scichart-the-best-wpf-chart/


1
SciChart一定很不错,我们很高兴有这个选择。然而,Geared也具有出色的性能、许多功能、非常易于使用、MVVM友好、超快和轻量级。而且,所有这些都只需花费SciChat价格的一小部分!对于那些严重依赖图表的公司来说,花费1000美元以上是有意义的,但很多公司(就像我的情况)仅需要一个项目中有时用到的单个图表。当你只需要一个快速轻量级的折线图表时,花费1000美元在一个库上实在太多了。而99美元的Geared则是完美的解决方案! - Steve

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接