WPF-Chart / Visualisierung von Echtzeitdaten

9

Ich habe versucht, herauszufinden, wie man Echtzeitdaten als Liniendiagramm in WPF rendert. Und in Echtzeit meine ich Daten, die von einem USB-Gerät gesammelt werden, das Daten mit einer Rate von ungefähr 40 Hz erzeugt. Es gibt mehrere (bis zu 7) Datenströme, die ich bei 40 Hz auf asynchrone Weise lese.

Ich habe versucht, zwei Standardlösungen zu verwenden (WPF-Toolkit-Diagramme und Swordfish-Diagramme) und habe fast in die Dynamic Data Visualization-Komponente geblickt, habe sie aber nach dem Lesen einiger Kommentare in ihrem Forum aufgegeben. Es scheint, dass Standard-Charting-Lösungen auf statische Diagramme ausgerichtet sind und ich tatsächlich etwas ähnliches wie den Windows Task-Manager brauche - nur viel schneller und mit viel mehr Datenpunkten.

Momentan habe ich meine eigene Lösung gerollt, die bisher am besten funktioniert, aber ich habe das Gefühl, dass ich etwas verpasse, weil es scheint, dass ich in der Lage sein sollte, bessere Ergebnisse zu erzielen.

>

Die Anforderungen sind, dass es einen konstanten Bereich von ungefähr 10000 Punkten in einem gleitenden Fenster handhaben kann - wenn neue Daten eingehen (bei 40 Hz), werden alte Daten nach links außerhalb des sichtbaren Bereichs verschoben. Und es muss diese Rate für mindestens 20 bis 30 Minuten aufrechterhalten (insgesamt etwa 75 bis 100 Tausend Punkte pro Datenstrom).

Meine aktuelle benutzerdefinierte Implementierung basiert auf einer Komponente, die von Shape erbt und eine StreamingGeometry für die DefinitiveGeometry verwendet. Die vom Gerät eingehenden Daten werden über eine Warteschlange an die Komponente übergeben, um die Leistung aufgrund des inhärenten "Bersteffekts" zu verbessern, und nach einer Entnahmebetätigung wird die Komponente ungültig gemacht.

Also, meine Frage ist, bin ich auf dem richtigen Weg oder bin ich völlig falsch? Was ist der effizienteste Weg, um eine solche Datenvisualisierung in WPF zu erreichen? Jede Hilfe oder Hinweise würden sehr geschätzt werden.

    
Mike Dinescu 25.03.2010, 16:23
quelle

3 Antworten

1

Das beibehaltene Modus-Rendering von WPF macht das Zeichnen / Neuzeichnen von benutzerdefinierten Diagrammen und Bildern schwierig, um Performanz zu erzielen, insbesondere wenn diese Zeichnungen viele Objekte enthalten.

Die schnellste Zeichnung, die ich in WPF erstellen konnte, ist die Verwendung einer WritableBitmap und das Ausfüllen eines Aufrufs für WritePixels, was eine Option für Sie sein könnte. Es hat die Zeichengeschwindigkeit des Diagramms, das ich mit PathGeometries geschrieben und in ein Canvas gezeichnet habe, erheblich übertroffen.

Ich bin gespannt, ob es einen schnelleren Mittelweg gibt.

    
Ed Gonzalez 25.03.2010 17:44
quelle
1
  

Disclosure: Ich besitze ABT Software und habe SciChart entwickelt und dazu beigetragen, dass WriteableBitmapEx Open-Source-Bibliothek

Leider vermisst du nichts. Die beibehaltene Modus-Rendering-Engine in WPF / Silverlight liefert eine schlechte Leistung für diese Art von Arbeit. Ich habe an einer Reihe von Systemen gearbeitet, die von Windows Forms auf WPF aktualisiert wurden, wo der Client durch die Rendering-Leistung dieses "GPU Accelerated" -Frameworks sehr enttäuscht wurde!

Wie auch immer, es gibt einen Weg. Verwenden Sie das sofortige Modus-Rendering. Überprüfen Sie die WriteableBitmap- oder InteropBitmap-Klassen. Es gibt eine ausgezeichnete Open-Source-Bibliothek namens WriteableBitmapEx von Rene Schulte zu dem ich beigetragen habe. WriteableBitmapEx bietet einige Zeichenfunktionen auf niedriger Ebene (GDI-Stil) zum direkten Zeichnen in Bitmap. Dies liefert eine fantastische Leistung und einen geringen Speicherbedarf (ja, das Framework von MS wird durch einige gut optimierte For-Schleifen und Zeiger auf Byte-Array übertroffen).

Wenn es sich um eine bestimmte Diagrammkomponente eines Drittanbieters handelt, versuchen Sie SciChart . SciChart ist eine Komponente, die ich selbst entwickelt habe, um die Lücke für WPF- oder Silverlight-Scientific / Aktien-Charts zu schließen. Es verwendet proprietäre Resampling-Algorithmen, um das Dataset vor dem Zeichnen zu reduzieren, sofortiges Moden-Rendering und eine Vielzahl weiterer Optimierungen wie Objekt-Pooling und Wiederverwendung von Ressourcen, was zu sehr hohen Aktualisierungsraten für sehr große Datasets und wenig Speicherbedarf führt.

Klicken Sie auf die Performance-Demo auf dem obigen Link (erfordert Silverlight 4). Gegenwärtig kann SciChart 1.000.000 Datenpunkte bei etwa 5 FPS (abhängig von der Zielhardware) rendern, was 5.000.000 Datenpunkten pro Sekunde entspricht. Eine kommerzielle Lizenz wird im ersten Quartal 2012 verfügbar sein.

    
Dr. ABT 21.12.2011 12:19
quelle
1

Die besten Ergebnisse können durch Low-Level-DirectX-Programmierung und die Verwendung von HLSL-Shadern erzielt werden. System.Windows.Media-Namespace-basiertes Rendering sollte sofort vergessen werden, wenn maximale Leistung und Echtzeitanforderungen wichtig sind.

Wir waren in der Lage, Routinen zu entwickeln, die über 1000 Millionen Datenpunkte, z. 8 Datenzufuhren x 125 M Datenpunkte, unter Verwendung einer breiten Linie, kein Downsampling. Die Routinen sind Teil von LightningChart , WPF-Diagrammen (und WinForms-Diagramm). Es dauerte 7 Jahre, bis wir an diesen Punkt kamen ... Wir haben ein Milliarden-Punkte-Beispiel gemacht, mit VS-Projekt und Youtube-Video.

[Ich bin Tech Lead von LightningChart]

    
Pasi Tuomainen 30.08.2016 21:39
quelle