2D-Zeichnungsleistung (GDI + vs SlimDX)

8

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:

  • Eine GDI + -Route, auf der Grafiken zu einer WriteableBitmap oder InteropBitmap gezeichnet werden.
  • SlimDX oder DirectX Variante (gehostet in einem D3DImage)


Angesichts dieser zwei sehr unterschiedlichen Ansätze, die am besten zu berücksichtigen wäre:

  • Die Interaktion mit dem Graphen muss schnell erfolgen, auch während der gesamte Graph angezeigt wird.
  • Die Aktualisierung der Bilder sollte schnell erfolgen (Farb- oder Größenänderung)
  • Treffertests müssen schnell sein (Punkt und Rechteck).
  • Die Entwicklung muss rechtzeitig abgeschlossen werden.

Welche Methode würden Sie verwenden und warum?

BEARBEITEN:
Es sieht so aus, als ob eine ähnliche Frage gestellt wurde, aber nicht beantwortet wurde.

    
CBent 23.04.2012, 18:56
quelle

3 Antworten

7

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):

  1. Zuallererst: messen . Verwenden Sie einen Profiler, um zu sehen, was der eigentliche Engpass in Ihrem Code ist.
  2. GDI-Primitive wiederverwenden Das ist lebenswichtig. Wenn Sie 100.000 Grafikobjekte zeichnen müssen, die gleich oder ähnlich aussehen, verwenden Sie dasselbe Pen , Brush usw. Das Erstellen dieser Primitiven ist teuer.
  3. Rendering-Daten zwischenspeichern - zum Beispiel: gfx-Elementpositionen nicht neu berechnen, wenn dies nicht erforderlich ist.
  4. Zeichnen Sie beim Verschieben / Zoomen die Szene mit niedrigerer GDI + -Qualität (und ohne teure GDI-Operationen). Es gibt eine Reihe von Graphics -Objekteinstellungen, um die Qualität zu verringern. Nachdem der Benutzer das Panning beendet hat, zeichnen Sie die Szene mit der hohen Qualität.
  5. Viele und viele kleine Dinge, die die Leistung verbessern. Ich entwickle jetzt diese App für 2-3 Jahre (oder ist es schon 4 hmm?) Und finde immer noch Wege, Dinge zu verbessern :). Aus diesem Grund ist Profiling wichtig - der Code ändert sich und dies kann sich auf die Leistung auswirken. Daher müssen Sie den neuen Code profilieren.

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.

    
Igor Brejc 25.04.2012 07:02
quelle
3

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.

    
Grokys 25.04.2012 19:16
quelle
1

Lassen Sie mich versuchen, die Vor- und Nachteile jedes Ansatzes aufzulisten - was Ihnen vielleicht eine Vorstellung davon gibt, was Sie verwenden sollten.

GDI-Profis

  • Einfaches Zeichnen von Vektorformen mit
  • Es müssen keine zusätzlichen Bibliotheken hinzugefügt werden

GDI Nachteile

  • Langsamer als DX
  • Sie müssen das "fancy" Zeichnen (Farbverläufe und ähnliches) einschränken oder es verlangsamen
  • Wenn das Diagramm interaktiv sein muss - ist das möglicherweise keine gute Option

SlimDX Vorteile

  • Kann etwas schickes Zeichnen machen, während es schneller ist als GDI
  • Wenn die Zeichnung interaktiv ist - wird dieser Ansatz viel besser sein
  • Da Sie die Grundelemente zeichnen, können Sie die Qualität auf jeder Zoomstufe kontrollieren

SlimDX Nachteile

  • Es ist nicht sehr einfach, einfache Formen zu zeichnen - Sie müssen Ihre eigenen Abstraktionen schreiben oder eine Bibliothek verwenden, mit der Sie Formen zeichnen können
  • Nicht so einfach, eine GDI zu verwenden, besonders wenn Sie sie vorher nicht verwendet haben

Und vielleicht habe ich vergessen, hier hinein zu legen, aber vielleicht werden diese für Anfänger ausreichen?

-A.

    
Ani 23.04.2012 20:32
quelle

Tags und Links