myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » GUI: WPF und Silverlight » WPF Chart Control mit guter Performance gesucht
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

WPF Chart Control mit guter Performance gesucht

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
JayJay10
myCSharp.de-Mitglied

Dabei seit: 28.11.2006
Beiträge: 59


JayJay10 ist offline

WPF Chart Control mit guter Performance gesucht

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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!
16.09.2010 12:59 Beiträge des Benutzers | zu Buddylist hinzufügen
Chaosmaster Chaosmaster ist männlich
myCSharp.de-Mitglied

Dabei seit: 16.09.2009
Beiträge: 31
Entwicklungsumgebung: VS 2010
Herkunft: Stuttgart


Chaosmaster ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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
28.09.2010 23:25 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
michlG michlG ist männlich
myCSharp.de-Poweruser/ Experte

avatar-2909.png


Dabei seit: 26.07.2007
Beiträge: 3.430
Entwicklungsumgebung: VS 2010 PRO
Herkunft: Naturns - Südtirol - Italien


michlG ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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
28.09.2010 23:37 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
JayJay10
myCSharp.de-Mitglied

Dabei seit: 28.11.2006
Beiträge: 59

Themenstarter Thema begonnen von JayJay10

JayJay10 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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 30.09.2010 10:06.

30.09.2010 09:59 Beiträge des Benutzers | zu Buddylist hinzufügen
Chaosmaster Chaosmaster ist männlich
myCSharp.de-Mitglied

Dabei seit: 16.09.2009
Beiträge: 31
Entwicklungsumgebung: VS 2010
Herkunft: Stuttgart


Chaosmaster ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.
30.09.2010 20:03 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
squadwuschel squadwuschel ist männlich
myCSharp.de-Mitglied

Dabei seit: 27.07.2007
Beiträge: 406
Entwicklungsumgebung: VS Prof. 2013
Herkunft: Dresden


squadwuschel ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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
04.10.2010 07:52 Beiträge des Benutzers | zu Buddylist hinzufügen
JayJay10
myCSharp.de-Mitglied

Dabei seit: 28.11.2006
Beiträge: 59

Themenstarter Thema begonnen von JayJay10

JayJay10 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Bin heute auf dieses Chart hingewiesen worden  Steema. Habe es aber noch nicht testen können...
05.10.2010 14:14 Beiträge des Benutzers | zu Buddylist hinzufügen
JayJay10
myCSharp.de-Mitglied

Dabei seit: 28.11.2006
Beiträge: 59

Themenstarter Thema begonnen von JayJay10

JayJay10 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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 08.10.2010 09:59.

08.10.2010 09:58 Beiträge des Benutzers | zu Buddylist hinzufügen
Zwischen diesen beiden Beiträgen liegen mehr als 2 Jahre.
pinki
myCSharp.de-Mitglied

avatar-4072.jpg


Dabei seit: 24.08.2008
Beiträge: 660
Herkunft: OWL


pinki ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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
30.09.2013 15:07 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
gfoidl gfoidl ist männlich
myCSharp.de-Team

avatar-2894.jpg


Dabei seit: 07.06.2009
Beiträge: 6.548
Entwicklungsumgebung: VS 2019
Herkunft: Waidring


gfoidl ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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ü
30.09.2013 16:09 Beiträge des Benutzers | zu Buddylist hinzufügen
pinki
myCSharp.de-Mitglied

avatar-4072.jpg


Dabei seit: 24.08.2008
Beiträge: 660
Herkunft: OWL


pinki ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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 30.09.2013 16:35.

30.09.2013 16:26 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
michlG michlG ist männlich
myCSharp.de-Poweruser/ Experte

avatar-2909.png


Dabei seit: 26.07.2007
Beiträge: 3.430
Entwicklungsumgebung: VS 2010 PRO
Herkunft: Naturns - Südtirol - Italien


michlG ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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
01.10.2013 15:40 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 8 Jahre.
Der letzte Beitrag ist älter als 5 Jahre.
Antwort erstellen


© Copyright 2003-2019 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 19.08.2019 01:16