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>

person Tim van Peterson    schedule 18.10.2017    source источник
comment
Вы пытались профилировать свое приложение? Какие методы потребляют больше всего процессорного времени?   -  person dymanoid    schedule 18.10.2017
comment
по теме: Советы по повышению эффективности динамических диаграмм   -  person Nick Alexeev    schedule 15.04.2019


Ответы (4)


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

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

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

person Kevin Ross    schedule 19.10.2017

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

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

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

person AlexKirova    schedule 22.10.2019

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

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

person Steve    schedule 31.01.2020
comment
«Всего за 99 долларов это стоит как пустяк… но меня беспокоит отсутствие активной разработки» ну, это довольно большая проблема. - person Dr. Andrew Burnett-Thompson; 31.01.2020
comment
Да, это моя точка зрения. Такая библиотека за такую ​​цену — это круто, но ее нужно активно развивать. В противном случае цена не поможет, и жуки убьют его. - person Steve; 31.01.2020

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

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

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

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

person Dr. Andrew Burnett-Thompson    schedule 07.03.2019
comment
SciChart должен быть хорошим, и здорово, что у нас есть такая возможность. Тем не менее, Geared также обладает отличной производительностью, множеством функций, очень прост в использовании, совместим с MVVM, очень быстр и легок. И все это за небольшую часть стоимости SciChat! Трата более 1000 долларов США на графики может иметь смысл для компаний, сильно полагающихся на них, но многим компаниям (как в моем случае) иногда требуется только одна диаграмма для проекта. Тратить 1000 долларов на библиотеку — это слишком много, когда все, что вам нужно, — это быстрая и легкая линейная диаграмма, и ничего больше. Geared за 99 долларов – идеальное решение для этого! - person Steve; 31.01.2020