LiveCharts WPF плохая производительность рендеринга

Я создаю инструмент WPF для визуализации данных для рефрижераторных контейнеров (охлаждающих контейнеров). Довольно простой график данных датчика (температура, уставка, влажность).
Проблема заключается в производительности рендеринга. Данные загружаются невероятно быстро через REST API. После переформатирования значений в DateTimePoints (занимает 1 мс) они устанавливаются в качестве значений с привязкой для привязанного SeriesCollection. Сразу же после установки значений приложение зависает на 10 секунд, зацикливает диаграмму, и все приложение больше не может быть использовано. Я работал над всеми примерами и демонстрациями, но я не могу заставить LiveCharts работать так, как мне нужно, и я не знаю, что я делаю здесь неправильно

CartesianChart
3x GStepLineSeries с (в данном случае) 626 значениями для серии
XAxisFormatter DateTimePoint

Я понятия не имею, что я делаю не так. Являются ли значения 1900 GearedValues ​​слишком большими? LiveCharts это дерьмо?

CartesianChart GStepLineSeries

 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>

1 ответ

Я смог заставить график рисовать примерно за 1,5 секунды с 1000 точками данных в каждой серии, внеся несколько изменений

  • Установите "Hoverable" на false на графике
  • Сделать геометрию точки нулевой на всех сериях

Моя версия кода также использовала стандартную таблицу, а не версию с редуктором, так как у меня нет лицензии на это, так что это может быть еще быстрее для вас.

У меня тоже была эта проблема, и у меня сработало:

SeriesCollection[0].Values = chartvalues.AsGearedValues().WithQuality(Quality.High)

Качество конечно необязательно. Но даже с 200к точек у меня больше нет проблем с рендерингом. В моем примере значения cahrtChartValues<ObservablePoint>. Пока я пропустил этот материал asgearedvalues, он не работал, хотя показывать, что это настроенная коллекция, и должно быть хорошо.

Бесплатные LiveCharts очень плохо работают. Это нормально, если вы хотите отобразить несколько десятков точек данных, может быть, несколько сотен. Если у вас много данных для отображения, вам нужна высокая производительность, Geared - это ответ. Я начал с бесплатной версии, но примерно через 1000 пунктов пользовательский интерфейс перестал обновляться, а загрузка ЦП составила 40%, даже с отключенными анимациями, наведением курсора и всплывающими подсказками. Единственное, что помогло, это установкаPointGeometry к null. Это решило проблему производительности, но также удалило кружки для точек, что было недопустимо.

Затем я попробовал Geared, и даже при многих тысячах точек, наведении указателя мыши, включенных всплывающих подсказках и PointGeometry по умолчанию скорость и производительность превосходны (загрузка ЦП только 1%). Я оставил анимацию отключенной и установил низкое качество. Geared настолько быстрый, легкий, красивый и многофункциональный, что это потрясающе. Всего за 99 долларов это ничего не стоит. Особенно по сравнению с SciChart, который стоит в 10 раз дороже. Единственное, что меня беспокоит в LiveCharts и Geared, - это отсутствие активной разработки. Оба они последний раз обновлялись в 2018 году, и Бето, похоже, только что исчез. Geared настолько фантастический, что было бы очень грустно, если бы проект забросили. Опять же, 99 долларов за такую ​​библиотеку - это пустяк.

К сожалению, диаграммы с открытым исходным кодом для WPF не очень эффективны. Если вы хотите добиться большего количества точек и обновлений в реальном времени, вам может потребоваться коммерческая диаграмма.

Я хотел бы предложить свой собственный компонент SciChart в качестве потенциального решения. Да, он коммерческий, и я скажу, что являюсь владельцем, однако он действительно может решить проблему медленных диаграмм WPF, предоставив вам основу для превосходной производительности (миллионы точек, миллисекундные обновления). Он также поддерживает MVVM и обладает множеством функций.

Пожалуйста, посмотрите, есть ли у вас время, URL-адрес https://www.scichart.com/wpf-chart-features

Конкретную демонстрацию производительности можно найти на странице https://www.scichart.com/why-scichart-the-best-wpf-chart/

Другие вопросы по тегам