Я создаю инструмент 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>