26 Stimmen

Der leistungsfähigste Weg, um Tausende von Datenpunkten mit WPF grafisch darzustellen?

Ich habe ein Diagramm geschrieben, das Finanzdaten anzeigt. Die Leistung war gut, solange ich weniger als 10.000 Punkte als zusammenhängende Linie gezeichnet habe, indem ich PathGeometry zusammen mit PathFigure y LineSegment s. Aber jetzt muss ich bis zu 100.000 Punkte gleichzeitig anzeigen (ohne Scrollen) und es ist schon mit 50.000 Punkten sehr langsam. Ich dachte an StreamGeometry aber ich bin mir nicht sicher, da es im Grunde dasselbe ist wie ein PathGeometry die Informationen als Byte-Stream zu speichern. Hat jemand eine Idee, wie man das viel performanter machen kann oder hat vielleicht sogar schon jemand etwas Ähnliches gemacht?

EDIT: Diese Datenpunkte ändern sich nicht, wenn sie einmal gezeichnet sind. Wenn es also Optimierungsmöglichkeiten gibt, lassen Sie es mich bitte wissen (die Liniensegmente sind im Moment eingefroren).

EDIT: Ich habe StreamGeometry ausprobiert. Das Erstellen der Grafik dauerte aus irgendeinem Grund noch länger, aber das ist nicht das Problem. Das Zeichnen auf dem Diagramm nach dem Zeichnen aller Punkte ist immer noch so langsam wie die vorherige Methode. Ich denke, es ist einfach zu viele Datenpunkte für WPF zu behandeln.

EDIT: Ich habe ein bisschen herumexperimentiert und festgestellt, dass sich die Leistung etwas verbessert hat, indem ich die Koordinaten, die vorher in double waren, in int umgewandelt habe, um zu verhindern, dass WPF Anti-Aliasing Sub-Pixel-Linien.

EDIT: Vielen Dank für alle Antworten, die vorschlagen, die Anzahl der Liniensegmente zu reduzieren. Ich habe sie auf höchstens das Doppelte der horizontalen Auflösung für gestufte Linien und höchstens die horizontale Auflösung für einfache Linien reduziert und die Leistung ist jetzt ziemlich gut.

3voto

PeterAllenWebb Punkte 10013

Ich glaube, die einzige Methode, die schneller sein könnte, während in der WPF-Framework verbleibt, wäre OnRender in einem benutzerdefinierten Steuerelement zu überschreiben. Sie können dann Ihre Geometrie direkt an die persistierte Szene rendern und alles aus der Ansicht ausschließen. Wenn der Benutzer nur einen kleinen Teil des Datensatzes zu einer Zeit sehen kann, könnte Culling auf seine eigene genug sein.

Bei so vielen Datenpunkten ist es unwahrscheinlich, dass der Benutzer alle Details sehen kann, wenn der gesamte Datensatz angezeigt wird. Es könnte sich also lohnen, den Datensatz für die Vollansicht zu vereinfachen und dann eine detailliertere Ansicht zu zeigen, wenn der Nutzer hineinzoomt.

Edit: Probieren Sie auch StreamGeometry aus. Seine ganze Grund für die Existenz ist Leistung, und Sie wissen nie, bis Sie versuchen.

1voto

Mark Punkte 9164

Dies ist eine muy Eine gute Frage, die im Kern die Frage aufwirft: "Kann ein Benutzer einen Bildschirm mit 100.000 diskreten Punkten praktisch nutzen oder geschäftliche Entscheidungen treffen?

Nach den besten Praktiken der GUI-Designphilosophie sollte die Antwort lauten Nein Das wirft die Frage auf, ob es nicht einen anderen Weg gibt, um die Anforderungen für die Bewerbung zu erfüllen.

Wenn wirklich 100.000 Punkte auf dem Bildschirm angezeigt werden sollen, ohne dass ein Bildlauf stattfindet, dann ist ein Puffer außerhalb des Bildschirms der richtige Weg. Fügen Sie Ihr Bild zu einer Bitmap zusammen, und fügen Sie diese Bitmap dann nach Bedarf in Ihr Fenster / Ihre Seite ein. Auf diese Weise wird das schwere Heben nur einmal getan, wonach die Hardwarebeschleunigung jedes Mal verwendet werden kann, wenn das Fenster gezeichnet werden muss.

Ich hoffe, das hilft.

0voto

MusiGenesis Punkte 72729

Ich habe nicht mit WPF (Disclaimer) gearbeitet, aber ich vermute, dass Ihre Leistung Problem ist, weil Ihr Code versucht, eine glatte gekrümmte Linie durch alle Ihre Daten passen, und die erforderliche Zeit steigt geometrisch (oder schlimmer) mit der Anzahl der Datenpunkte.

Ich weiß nicht, ob dies optisch akzeptabel wäre, aber versuchen Sie, Ihre Daten grafisch darzustellen, indem Sie jeden Punkt mit dem letzten durch eine gerade Linie verbinden. Dadurch sollte die Zeit bis zur Erstellung des Diagramms proportional zur Anzahl der Datenpunkte sein, und bei so vielen Punkten wie Sie haben, könnte das Diagramm am Ende sowieso genau gleich aussehen.

0voto

cplotts Punkte 13743

Eine andere Idee wäre, das Image-Steuerelement zu verwenden, wobei die Eigenschaft Source auf ein dynamisch erstelltes DrawingImage gesetzt ist.

Nach Angaben von Pavan Podila en WPF Control Entwicklung entfesselt Dieser Ansatz kann sehr hilfreich sein, wenn Sie Tausende von Bildern haben, die keine Interaktivität benötigen. Auf Seite 25 seines Buches finden Sie weitere Informationen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X