Question

J'ai créé quelques graphiques simples (de type FastLine) avec MSChart et les mettre à jour avec les données en direct, comme ci-dessous:

MSCharts niveau graphique

Pour ce faire, je lie une collection observable d'un type personnalisé au tableau comme ceci:

                // set chart data source
            this._Chart.DataSource = value; //is of type ObservableCollection<SpectrumLevels>

            //define x and y value members for each series
            this._Chart.Series[0].XValueMember = "Index";
            this._Chart.Series[1].XValueMember = "Index";
            this._Chart.Series[0].YValueMembers = "Channel0Level";
            this._Chart.Series[1].YValueMembers = "Channel1Level";

            // bind data to chart
            this._Chart.DataBind(); //lasts 1.5 seconds for 8000 points per series

A chaque rafraîchissement, l'ensemble de données change complètement, il n'est pas une mise à jour de défilement!

Avec un profileur j'ai trouvé que l'appel DataBind() prend environ 1,5 secondes. Les autres appels sont négligeables.

Comment puis-je faire cela plus vite?

  • Dois-je utiliser un autre type que ObservableCollection? Un tableau sans doute?
  • Dois-je utiliser une autre forme de liaison de données?
  • Y at-il tweak pour le MSChart que je l'ai manqué?
  • Dois-je utiliser un ensemble sparsed de ce jour, ayant une valeur par pixel seulement?
  • Ai-je simplement atteint la limite de performance de MSCharts?

Du type de l'application pour le garder « fluent », nous devrions avoir plusieurs secondes par rafraîchissement.

Merci pour toutes les indications!

EDIT: Solution proposée par leppie:

                this._Chart.Series[0].Points.Clear();
            foreach (var item in value) //iterates over the list of custom objects
            {
                    this._Chart.Series[0].Points.Add(new DataPoint
                    {
                        XValue = item.Index,
                        YValues = new double[] { item.Channel0Level.Value }
                    });

            }

Cela fonctionne maintenant plus de deux fois plus vite!

Était-ce utile?

La solution

Utilisez les autres méthodes de Bind, ils sont très rapides.

mettre à jour environ 15 séries de 3 zones, avec 300 points dans chaque série, chaque seconde, et pas vraiment ralenti.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top