Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
WPF Chart Control mit guter Performance gesucht
JayJay10
myCSharp.de - Member



Dabei seit:
Beiträge: 59

Themenstarter:

WPF Chart Control mit guter Performance gesucht

beantworten | zitieren | melden

Hallo Zusammen,

ich suche ein Wpf Chart Control( kommerziell oder nicht kommerziell) welches zum zeichnen einer großen Datemenge mit hoher refresh rate geeignet ist.

Ich bekomme von einem Gerät Daten mit 200Hz über einen Zeitraum von ca. 5 Minuten geliefert. Diese Daten müsste ich möglichst vollständig auf dem Chart in einem XY-Graphen darstellen. Dass es schwer ist diese Datenmenge in WPF auf einem chartcontrol in "real-time" darzustellen ist mir dabei klar.

Implementiert sollte das ganze wie folgt werden. In einem ChartControlViewModel hätte ich eine ObserveableCollection und weitere properties an die die jeweilige chart componente gebunden wäre. Bei jeder Änderung der ObserveableCollection würde sich also auch der Graph refreshen. Meine ankommenden Daten stecke ich aber nicht direkt in diese Collection (da 200hz), sondern erst einmal in einen Buffer. Über einen Thread schiebe ich dann in vorgegebenen Abständen die neuen Daten in die Collection und die refresh rate auf 10Hz (was fürs Auge gerade noch nicht sichtbar ist) einstellen. Weiterhin würde ich nicht den gesamten Datenbereich darsetellen, sondern z.B. immer nur die letzte Minute. Und den Rest evtl. über eine Scrollbar.

Bisher habe ich hierzu ComponentOne, Syncfusion und ChartFX getestet, wobei ich aber niemals unter eine CPU load von < 60% gekommen bin. Auch die Tipps vom support der hersteller konnten mir nicht weiterhelfen.

Vielleicht hatte jemand schon einmal ein ähnliches Problem und kennt eine gute chart komponente die für solche gegebenheiten geeignet ist. Ich bin für jeden Ratschlag dankbar!

Viellecht müsste ich auch die Datenmenge über einen Algorithmus verkleinern. Wenn also jemand einen solchen Algorithmus kennt, der die relevanten Punkte für die Kurvenform herausfiltert dann her damit!
private Nachricht | Beiträge des Benutzers
Chaosmaster
myCSharp.de - Member



Dabei seit:
Beiträge: 31
Herkunft: Stuttgart

beantworten | zitieren | melden

Hi,

Ich steh momentan vor dem gleichen Problem, habe mir auch schon ein paar Charting Libs angeschaut aber noch keine Performance Tests gemacht.

Was Du Dir anschauen könntest:

DataChart von Infragistics ... Die werben mit hoher Refreshrate

Radchart von Telerik ... Hab wir in der Firma im Einsatz, ganz ok eigentlich, ich glaub die sampeln die Daten automatisch runter

DynamicDataDisplay auf Codeplex ... Sehr Performant


Würd mich freuen wenn Du über Deine Erfahrungen berichtest ...

Gruß Mathias
private Nachricht | Beiträge des Benutzers
michlG
myCSharp.de - Experte

Avatar #avatar-2909.png


Dabei seit:
Beiträge: 3652
Herkunft: Naturns - Südtirol - Italien

beantworten | zitieren | melden

Hallo Leute,

ich habe so etwas ähnliches auch vor ein paar Monaten erlitten

Bei mir war es eine einfache Statistik in der Messwerte über einen vom User gewählten Zeitraum dargestellt wurden
Wenn dieser einen großen Zeitraum gewählt hat, hatte ich teilweise > 30k Messpunkte.
Dadurch ist mein Chart (Syncfusion) total ins Schleudern gekommen. Der Aufbau dauerte mehr als 20 Sekunden bei einem Core i7 und brauchte 1 GB Ram

Die Daten habe ich mit einem Algorithmus gefiltert.
Den Algorithmus habe ich mit der Hilfe des Forums erstellt. Siehe: Algorithmus um Kurve (eine Liste von Punkten) zu komprimieren

PS: ich rate dir von Syncfusion ab, denn deren Controls sind wie ein Weihnachtskalender (nur das ganze Jahr über).
Jeden Tag kann man sich überraschen lassen was man für einen neuen Bug findet. :)

Gruss
Michael
private Nachricht | Beiträge des Benutzers
JayJay10
myCSharp.de - Member



Dabei seit:
Beiträge: 59

Themenstarter:

beantworten | zitieren | melden

Dank schon mal für die Ratschläge,

ich habe mir für meine Tests eine kleine Applikation geschrieben, die 100Hz Daten als Siunskurve ausgibt und dann an ein ChartViewModel weitergibt. Die Daten landen dann in einer ThrottledCollection, die mit 25Hz ein OnPropertyChanged event auslöst und der Graph dann refreshed wird. Diese Testapplikation habe ich dann auch mit den jeweiligen Chartcontrols aus trial versionen an die Hersteller geschickt, um deren Meinung zu hören. Folgendes Ergebnis:

- ChartFX unterstützen momentan keine real time plots, eine real time APi ist aber geplant. Konnten mir allerdings kein release datum nennen.

- Syncfusion nicht geeignet

- ComponentOne nicht geeignet

- Telerik nicht geeignet, arbeiten aber an Verbesserungen der Performance für ein release in Q3

Warte noch auf eine Antwort von Infragistics aber in der Testappliaction wars auch nicht besser als die anderen. Ich habe dann auch probiert Windows Forms controls von XCEED einzubinden, was aber auch keine großartige Verbesserung gebracht. Insgesamt hat es kein Control geschafft die CPU Performance auf meinem Testsystem (Intel Core2Duo 2.66 GHz 2GB RAM) unter 40% zuhalten und spätestens nach etwa 500 - 700 Datenpunkten in der Collection war ich auf 70%.

ABER: Ich habe einen weiteren Test gemacht. Ich habe ein einfaches selbst geschriebenes Windows Forms Chart Control eines Kollegen eingebunden, dass nur die neuen Punkte auf dem Graph zeichnet. Und siehe da, die CPU Performance ist auf unter 3% gesunken. Alle controls der Dritthersteller refreshen den gesamten Graphen, sobald das OnPropertyChanged event ausgelöst wird. Bei manchen kann man den Refresh auf das Event abstellen und manuell ausführen aber selbst beim manuellen refreshen wird immer das gesamte control neu gezeichnet was bei mir ja mit mindestens 25Hz erfolgen muss.

Also bin ich im moment auf der Suche nach einem Control das mir ermöglicht nur die neu hinzugekommenen Datenpunkte zu zeichnen und das gesamte Control nur refreshed wird wenn es nötig ist! Habe auch eine Anfrage an die Hersteller geschickt ob ich diese Funktion selbst in den sourcode mit geringem Aufwand einpflegen könnte.

Mal abwarten was kommt ...
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von JayJay10 am .
private Nachricht | Beiträge des Benutzers
Chaosmaster
myCSharp.de - Member



Dabei seit:
Beiträge: 31
Herkunft: Stuttgart

beantworten | zitieren | melden

Ich hatte heute einen Termin mit einem Entwickler, der in seiner Software Liniendiagramme in "Echtzeit" anzeigt (eigentlich gings um was ganz anders), es handelt sich allerdings um ein .NET Forms-Control, das er selbst entwickelt hat. Er hat sich entschlossen das Control selbst zu entwickeln, nachdem er mit zugekauften Controls nie zufrieden war.

Ich hab das Gefühl, die ganzen Charting-Libs zielen eher auf Business-Anwendungen ab, in denen statische Daten angezeigt werden oder die Daten sich nur langsam ändern (z.B. Finanzbranche) ... für Anwendungen im Messtechnik-Bereich wo man eine Art Oszilloskop-Darstellung benötigt haben diese Bibliotheken zu viel Overhead.
private Nachricht | Beiträge des Benutzers
squadwuschel
myCSharp.de - Member



Dabei seit:
Beiträge: 406
Herkunft: Dresden

beantworten | zitieren | melden

Hio,

habe zwar von der Materie nicht soviel Ahnung, habe aber mit DevEpxress ganz gut Erfahrungen gemacht und die bieten auch Charting Controls an für WPF:

DevExpress Charting

evtl. mal damit versuchen
Mein Blog über .NET und MVC / EF | Meine kostenlose Onlinearbeitszeitverwaltung My:Worktime
private Nachricht | Beiträge des Benutzers
JayJay10
myCSharp.de - Member



Dabei seit:
Beiträge: 59

Themenstarter:

beantworten | zitieren | melden

Bin heute auf dieses Chart hingewiesen worden Steema. Habe es aber noch nicht testen können...
private Nachricht | Beiträge des Benutzers
JayJay10
myCSharp.de - Member



Dabei seit:
Beiträge: 59

Themenstarter:

beantworten | zitieren | melden

Kurzes Fazit meiner Performance-Tests: Für unseren Einsatz wie im ersten Post beschrieben, käme nur ein einziges chart control in Frage. Das wäre das open source DynamicDataDisplay chart. Leider kann man hier nur über workarounds und eigene source code Erweiterungen das chart für den vollständigen Einsatz mit dem MVVM pattern erweitern. Die Dokumentation ist auch nicht gerade ausführlich und das Projekt scheint irgendwie tot zu sein. Also muss ich doch die Zeit und Arbeit investieren und selbst ein chart control schreiben.

Vielleicht hat jemand schon sein eigenes chart geschrieben und kann mir ein paar Tipps geben?

Stichwort DrawingVisuals, DrawingImage ?
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von JayJay10 am .
private Nachricht | Beiträge des Benutzers
pinki
myCSharp.de - Member

Avatar #avatar-4072.jpg


Dabei seit:
Beiträge: 695
Herkunft: OWL

beantworten | zitieren | melden

Hallo,
ich grabe diesen Thread mal aus, da ich auch gerade auf der Suche nach einem solchen Steuerelement (für Aktualisierungen von 1 bis ~20 Datenreihen bei 1 bis 1000 Hz) bin.

Bei meiner Suche bin ich auf die (ich nehme an zum Startzeitpunkt dieses Threads noch nicht nicht existierenden oder zumindest kaum bekannten) Steuerelemente von scichart, LightningChart und visiblox gestoßen.

Hat jemand von euch Erfahrungen damit und kann eine Empfehlung aussprechen?


Gruß
pinki
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 7510
Herkunft: Waidring

beantworten | zitieren | melden

Hallo pinki,

Erfahrungen hab ich mit diesen keinen, aber sie schauen interessant aus. Danke für die Links.
Zitat
bis 1000 Hz
Aktualisierungen mit 1ms werden in Windows/.net ohnehin sehr schwierig bis unmöglich zu realisieren sein. Zumal es für einen (menschlichen) Betrachter ohnehin nicht wahrnehmbar ist. Daher wäre es besser die Daten vorher zu aggregieren und z.B. mit 10 Hz zu aktualisieren.

mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
private Nachricht | Beiträge des Benutzers
pinki
myCSharp.de - Member

Avatar #avatar-4072.jpg


Dabei seit:
Beiträge: 695
Herkunft: OWL

beantworten | zitieren | melden

Hallo gfoidl,
das war vielleicht etwas doof ausgedrückt. In der Frequenz kommen die Daten rein. Solange es hinterher auf dem Monitor flüssig wirkt, ist das alles in Ordnung. Wichtig ist mir nur, dass nach dem Rendern der Unterschied zu den wirklich zu dem Zeitpunkt eingetroffenen Daten mit bloßem Auge nicht auffallen darf.

Gruß
pinki


EDIT: Der Text wurde etwas konkretisiert.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von pinki am .
private Nachricht | Beiträge des Benutzers
michlG
myCSharp.de - Experte

Avatar #avatar-2909.png


Dabei seit:
Beiträge: 3652
Herkunft: Naturns - Südtirol - Italien

beantworten | zitieren | melden

Hallo pinki,

ich verwende die Controls von Telerik.
Das Ganze kostet zwar etwas, aber mit den Controls bin ich echt zufrieden.

Ich verwende den Chart sowohl für Statistiken als auch für Live-Daten Anzeigen.
Bei den Livedaten habe ich aber selten einen Intervall von einer Sekunde.
Aber mit dem Control müsste auch eine höhere Aktualisierungsfrequenz möglich sein.

Schau dir mal die Beispiele von den WPF Controls an.
Dort findest du eine große Auswahl an Szenarien die die Controls in Aktion zeigen

Grüße
Michael
private Nachricht | Beiträge des Benutzers