3 Stimmen

Wie in C#/WinForms mit anständiger Geschwindigkeit zu zeichnen?

Ich versuche, ein Diagramm zu visualisieren und den Leuten die Möglichkeit zu geben, damit zu spielen. Ich habe die hervorragende Graph#-Bibliothek gefunden, die ein erstes Layout erstellen kann, so dass dieser Teil abgedeckt ist. Jetzt muss ich ein Steuerelement, das tatsächlich zeichnet es und bietet die notwendige Interaktivität zu machen.

Graph# kommt mit einem netten Visualisierer selbst, aber ich mag es nicht, weil es in WPF geschrieben ist (während meine App WinForms ist), und weil ich einige mehr Interaktivität Optionen hinzufügen möchten, die ziemlich ein Remake von ihm sowieso erfordern würde.

Die Graphen, die ich zeichne, werden in der Regel ziemlich groß sein, mit etwa 100 Eckpunkten und der gleichen Anzahl von Kanten (die Graphen werden in 99 % der Fälle Bäume sein). Das bedeutet, dass das resultierende Rendering kann bis zu 2000px mal 2000px und sogar mehr sein. Die Benutzer sollten in der Lage sein, zu vergrößern und zu verkleinern, scrollen, markieren und ziehen Scheitelpunkte und Kanten, und erhalten einige Popups mit zusätzlichen Informationen, wenn der Cursor über einen Scheitelpunkt schwebt.

Ich bin besorgt, dass der Standard System.Drawing möglicherweise nicht in der Lage sein, eine angemessene Geschwindigkeit zu liefern. Ich möchte, dass das Ziehen/Zoomen/Scrollen flüssig abläuft, und die Popups sollten sich auch mit einer kleinen Animation öffnen. Etwas wie 20fps sollte eine Notwendigkeit sein.

Ich weiß, dass ich versuchen kann, die Dinge zu beschleunigen, indem ich viele der Elemente vorrendere und sie als Bitmaps im Speicher behalte - aber das würde wahrscheinlich viel Arbeitsspeicher beanspruchen, und ich bin mir immer noch nicht sicher, ob es die nötige Leistung bringen würde.

Was denken Sie darüber?

5voto

Neil N Punkte 24394

"Vorzeitige Optimierung ist die Wurzel allen Übels"

GDI+ kann für Ihre Bedürfnisse hervorragend geeignet sein. Gehen Sie nicht und kaufen Sie 3rd-Party-Bibliotheken, bevor Sie wissen, dass Sie sie überhaupt brauchen.

Ich habe tausend Polygone auf einer 1000x800 Pixel großen Bitmap erstellt und sie mit über 100 Bildern pro Sekunde komplett neu gezeichnet, nur mit GDI+

Das heißt, wenn Sie viel zu zeichnen haben und Ihre Auflösung groß ist. Einige der 3rd-Party-Zeichenbibliotheken können WEG über das hinausgehen, was verwaltete GDI fähig ist zu gehen.

1voto

Reed Copsey Punkte 536986

Ich empfehle, Graph# in Ruhe zu lassen, und nur Hosting in Ihrer Windows Forms-Anwendung .

Die Leistung, die Sie erhalten, wird viel besser sein, als wenn Sie versuchen, es in System.Drawing neu zu implementieren.

0voto

MusiGenesis Punkte 72729

GDI+ ist schnell genug für das, was Sie tun, vor allem, wenn (wie es aus Ihrer Beschreibung klingt) alles, was Sie zeichnen, Rechtecke und vertikale/horizontale Linien sind. Polygone und nicht-lineare Formen sind etwas langsamer, aber nicht viel (der Geschwindigkeitsunterschied hängt teilweise vom SmoothingMode Ihres Grafikobjekts ab). Das Zeichnen von zwischengespeicherten Bitmaps mit Größenänderung ist ebenfalls recht schnell, obwohl es sich erheblich verlangsamen kann, wenn Sie eine hochwertige InterpolationMode-Einstellung verwenden.

Als Benchmark habe ich eine .Net Compact Framework GPS-Anwendung für Windows Mobile geschrieben, die etwa 10.000 Zeilen in Echtzeit auf dem Bildschirm darstellte. Dabei wurde zwar nur eine Bildrate von einigen wenigen Bildern pro Sekunde erreicht, aber die Rechenleistung eines Smartphones ist natürlich viel geringer als die eines modernen PCs.

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