2017-10-18 8 views
1

Je construis un outil WPF pour visualiser des données pour les conteneurs frigorifiques (conteneurs de refroidissement). Tracé assez simple des données du capteur (températures, point de consigne, humidité).
Problème de performances de rendu. Les données sont chargées très rapidement via l'API REST. Après avoir reformaté les valeurs en DateTimePoints (prend 1ms), elles sont définies en tant que valeurs par engrenage sur SeriesCollection lié. Immédiatement après la définition des valeurs, l'application se fige pendant 10 secondes, rend le graphique stut- rial et l'application entière n'est plus utilisable. J'ai travaillé tous les exemples et des démonstrations, mais je ne peux pas Livecharts pour effectuer de façon utile et je ne sais pas ce que je fais mal iciLiveCharts WPF performance de rendu médiocre

CartesianChart
3x GStepLineSeries avec (dans ce cas) 626 Valeurs par série
XAxisFormatter DateTimePoint

Je ne sais pas ce que je fais mal. Les valeurs de GearedValues ​​de 1900 sont-elles trop importantes? Est-ce que LiveCharts est merdique?

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> 
+0

Avez-vous essayé de profiler votre application? Quelles méthodes consomment le plus de temps CPU? – dymanoid

Répondre

1

J'ai pu obtenir le graphique pour dessiner dans environ 1,5 secondes avec 1000 points de données dans chaque série en faisant quelques changements

  • Régler "Hoverable" sur false sur la carte
  • Faire la null géométrie du point sur toutes les séries

Ma version du code également utilisé le tableau standard ne la version réducteur que je n'ai pas de licence pour cette sorte qu'il pourrait être encore plus rapide pour vous.