LiveCharts WPF плохая производительность рендеринга
Я создаю инструмент WPF для визуализации данных для рефрижераторных контейнеров (охлаждающих контейнеров). Довольно простой график данных датчика (температура, уставка, влажность).
Проблема заключается в производительности рендеринга. Данные загружаются невероятно быстро через REST API. После переформатирования значений в DateTimePoints (занимает 1 мс) они устанавливаются в качестве значений с привязкой для привязанного SeriesCollection. Сразу же после установки значений приложение зависает на 10 секунд, зацикливает диаграмму, и все приложение больше не может быть использовано. Я работал над всеми примерами и демонстрациями, но я не могу заставить LiveCharts работать так, как мне нужно, и я не знаю, что я делаю здесь неправильно
CartesianChart
3x GStepLineSeries с (в данном случае) 626 значениями для серии
XAxisFormatter DateTimePoint
Я понятия не имею, что я делаю не так. Являются ли значения 1900 GearedValues слишком большими? LiveCharts это дерьмо?
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/