Ich bin Teil eines Teams, das ein Tool zum Anzeigen und Interagieren mit sehr großen und stark miteinander verbundenen Graphen in C # / WPF erstellt hat. Die Anzeige und Interaktion mit dem Diagramm erfolgt über ein benutzerdefiniertes Steuerelement, das eine Reihe von ZeichnungsVisuals aufnimmt und auf einer Leinwand anzeigt. Knoten im Diagramm können eine benutzerdefinierte Form haben, die mit unserem Editor erstellt wurde. Die aktuelle Kontrolle funktioniert sehr gut und ist ziemlich gut mit unserem Programm gekoppelt, aber es gibt berechtigte Sorgen über die Leistung, wenn man viel größere Graphen betrachtet (mehr als 20.000 Knoten und viele Verbindungen).
Nach ein bisschen Forschung scheint es die beiden Ansätze sind:
Angesichts dieser zwei sehr unterschiedlichen Ansätze, die am besten zu berücksichtigen wäre:
Welche Methode würden Sie verwenden und warum?
BEARBEITEN:
Es sieht so aus, als ob eine ähnliche Frage gestellt wurde, aber nicht beantwortet wurde.
Ich verwende GDI für meine kartografische Anwendung . Während GDI + langsamer ist als beispielsweise DirectX, finde ich, dass es viele Dinge und Tricks gibt, die verwendet werden können, um die Dinge zu beschleunigen. Ein Großteil der CPU wird für die Vorbereitung der Daten verwendet, bevor sie selbst gezeichnet wird. GDI sollte daher nicht der einzige Engpass sein.
Dinge, auf die Sie achten sollten (und diese sind allgemein genug, um sie auch auf andere Grafik-Engines anzuwenden):
Pen
, Brush
usw. Das Erstellen dieser Primitiven ist teuer. Graphics
-Objekteinstellungen, um die Qualität zu verringern. Nachdem der Benutzer das Panning beendet hat, zeichnen Sie die Szene mit der hohen Qualität. Eine andere Sache: Ich habe SlimDX nicht benutzt, aber ich habe Direct2D versucht (ich beziehe mich auf Microsoft.WindowsAPICodePack.DirectX.Direct2D1
). Die Leistung war in meinem Fall wesentlich schneller als GDI +, aber ich hatte einige Probleme mit dem Rendern von Bitmaps und hatte nie die Zeit, die richtige Lösung zu finden.
Ich habe kürzlich Zeichnungscode auf DirectX portiert und bin sehr zufrieden mit den Ergebnissen. Wir haben hauptsächlich Bitmaps mit Bit-Bashing gerendert und sehen Renderzeiten, die in Minuten gemessen werden können, auf etwa 1-2 Sekunden reduziert.
Dies kann nicht direkt mit Ihrer Verwendung verglichen werden, da wir von Bit-Bashing in C ++ zu Direct3D in C # mit SlimDX gegangen sind, aber ich kann mir vorstellen, dass Sie Performance-Vorteile sehen werden, auch wenn sie nicht der richtige sind Größenordnung, die wir sehen.
Ich würde Ihnen raten, Direct2D mit SlimDX zu verwenden. Sie müssen DirectX 10.1 verwenden, da Direct2D aus irgendeinem Grund nicht mit DirectX 11 kompatibel ist. Wenn Sie die Zeichen-API in WPF verwendet haben, sind Sie mit Direct2D bereits vertraut, da dessen API soweit wie möglich auf der WPF-Zeichen-API basiert. Die Hauptprobleme bei Direct2D sind mangelnde Dokumentation und die Tatsache, dass es nur in Vista funktioniert.
Ich habe nicht mit DirectX 10 / WPF interop experimentiert, aber ich glaube, dass es möglich ist (http://stackoverflow.com/questions/1252780/d3dimage-using-dx10)
EDIT: Ich dachte, ich würde Ihnen einen Vergleich von unserem Code zum Zeichnen eines einfachen Polygons geben. Zuerst die WPF-Version:
%Vor%Jetzt die Direct2D-Version:
%Vor%Wie Sie sehen können, ist die Direct2D-Version etwas mehr Arbeit (und beruht auf ein paar Hilfsfunktionen, die ich geschrieben habe), aber es ist eigentlich ziemlich ähnlich.
Lassen Sie mich versuchen, die Vor- und Nachteile jedes Ansatzes aufzulisten - was Ihnen vielleicht eine Vorstellung davon gibt, was Sie verwenden sollten.
GDI-Profis
GDI Nachteile
SlimDX Vorteile
SlimDX Nachteile
Und vielleicht habe ich vergessen, hier hinein zu legen, aber vielleicht werden diese für Anfänger ausreichen?
-A.