2D-Zeichnung-Performance (GDI+ vs SlimDX)
Ich bin ein Teil von einem team, dass hat wurde ein tool zum anzeigen und interagieren mit sehr großen und stark vernetzten Graphen in C#/WPF. Die Anzeige und Interaktion mit dem Graphen geschieht durch ein benutzerdefiniertes Steuerelement, das nimmt in einer Reihe von DrawingVisuals und zeigt Sie auf einer Leinwand. Knoten im graph kann eine custom-Form erstellt mit unserer Redaktion. Die aktuelle Steuerung funktioniert sehr gut und ist ziemlich gepaart mit unserem Programm, aber es gibt berechtigte sorgen über die Leistung, wenn man bedenkt viel größere Grafiken (20.000+ Einträge-Knoten und die Menge der Verbindung).
Nachdem ich ein wenig Forschung, scheint es, die beiden Ansätze sind:
- Ein GDI+ - route, wo Grafiken gezogen werden, um ein WriteableBitmap-Objekt oder InteropBitmap.
- SlimDX oder DirectX Variante (gehostet in einem D3DImage)
Angesichts dieser beiden sehr unterschiedlichen Ansätze, welche route wäre am besten zu nehmen, nachzudenken:
- Die Interaktion mit dem graph muss schnell sein, auch während der Anzeige der gesamten Grafik.
- Aktualisierung der Grafik sollte schnell sein (Farbe oder Größe ändern)
- Treffer Tests müssen schnell sein (Punkt und Rechteck).
- Entwicklung abgeschlossen sein muss in einer fristgerechten Weise.
Welche Methode würden Sie verwenden und warum?
EDIT:
Es sieht aus wie ein ähnliche Frage wurde gefragt, aber nicht beantwortet.
- GDI+ langsamer. GDI-schnell, aber hässlich. D2D ist besser, aber langsam. SlimDX ist eine große Abhängigkeit und großen abstrakte Lernkurve. Option 3, mit DX9 oder (DX11 per DXGI) wie es in der hand, schüttelt mit dem WPF-D3DImage-Schnittstelle. Gewährt eine Lernkurve, aber mehr wartbar zu erstellen 3DX-Gerät, Kontext -, Puffer -, shader-und erhalten Sie Ihre app-rendering über Direct3D. Die Dokumentation ist schrecklich und es dauert einige Forschungs-und trial-error, aber es ist nicht so schlimm, wie es scheint. Sehen Sie hier eine real world small 18 meg demo-download WinForm WPF und MFC, und seine vor allem WAV-und GIS-Daten.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich mit GDI für meine kartographische Anwendung. Während GDI+ langsamer ist als, sagen wir, DirectX, finde ich, dass es eine Menge Dinge und tricks, die verwendet werden können, um die Dinge zu beschleunigen. Viel CPU verwendet wird, für die Vorbereitung der Daten vor der Zeichnung selbst, so GDI-sollte nicht der einzige Engpass gibt.
Dinge zu suchen (und diese sind allgemein genug, um für andere Grafik-engines auch):
Pen
,Brush
etc. Die Erstellung dieser primitiven ist teuer.Graphics
Objekt-Einstellungen zu senken, die Qualität. Nachdem der Benutzer beendet schwenken, ziehen die Szene mit der hohen Qualität.Eine andere Sache: ich habe nicht verwendet SlimDX, aber ich wollte versuchen, Direct2D (ich beziehe mich auf
Microsoft.WindowsAPICodePack.DirectX.Direct2D1
). Die Leistung war deutlich schneller als GDI+ in meinem Fall, aber ich hatte einige Probleme mit Rendern von bitmaps und hatte nie die Zeit zu finden, die richtige Lösung.Ich habe vor kurzem portiert, einige Zeichnung code über DirectX und sind bisher sehr zufrieden mit den Ergebnissen. Wir waren vor allem das Rendern von bitmaps unter Verwendung von bit-bashing und sehen die rendering-Zeiten, die gemessen werden können, die in wenigen Minuten reduziert um 1-2 Sekunden.
Diese können nicht direkt miteinander verglichen werden, um Ihnen die Nutzung, da haben wir uns von bit-bashing in C++ zu Direct3D in C# using SlimDX, aber ich glaube, Sie werden sehen, performance-Vorteile, auch wenn Sie nicht die Größenordnungen, die wir sehen.
Ich würde Ihnen raten, nehmen Sie einen Blick auf Verwendung von Direct2D mit SlimDX. Benötigen Sie DirectX 10.1, wie Direct2D ist nicht kompatibel mit DirectX 11 für einige Grund. Wenn Sie bereits mit der Zeichnungs-API in WPF-dann sind Sie bereits vertraut mit Direct2D als seine API basiert auf der WPF-drawing-API, soweit ich das sagen kann. Die wichtigsten Probleme, mit Direct2D sind die fehlende Dokumentation und die Tatsache, es funktioniert nur unter Vista ab.
Habe ich noch nicht experimentiert mit DirectX 10/WPF-interop, aber ich glaube, es ist möglich (http://stackoverflow.com/questions/1252780/d3dimage-using-dx10)
EDIT: ich dachte, ich würde Ihnen einen Vergleich aus unserer code, der Zeichnung ein einfaches polygon. Zuerst wird die WPF-version:
Nun die Direct2D version:
Wie Sie sehen können, die Direct2D version ist etwas mehr Arbeit (und stützt sich auf ein paar Hilfsfunktionen, die ich geschrieben habe) aber es ist eigentlich ziemlich ähnlich.
Lassen Sie mich versuchen und Liste die vor-und Nachteile der einzelnen Ansatz -, die vielleicht Ihnen einige Vorstellung über die zu verwenden.
GDI Pros
GDI Nachteile
SlimDX Profis
SlimDX Nachteile
Und vielleicht auch mehr ich habe vergessen, im hier, aber vielleicht ist dies für den Anfang?
-A.