Direct2D / GDI+ und langsame Windows-Formen zeichnen - Was kann getan werden?
Ich arbeite viel mit Visual Studio 2008, .NET C# 2.0-3.5 und Windows Forms, und ich habe bemerkt, wie viele vor mir, dass GDI+ ist extrem langsam in der Zeichnung Kontrolliert. Hinweis, dass ich nicht viel mit Bildern (JPG, GIF usw) sehr viel. Bilder werden nur als Symbole in bestimmten Orten. Dies ist tatsächlich Steuerelemente/Formulare/etc, die langsam zu ziehen.
Das Problem ist, dass Sie sehen können Steuerelemente gezogen wird, und es kann mehrere Sekunden dauern, einen scheinbar einfachen Satz von Steuerelementen gezeichnet werden. Dh, seine rückständigen und schrecklich.
Habe ich tests gemacht, wo ich nur eine Anzahl von Etiketten (40-50) auf eine form, drücken von F5 ausführen und warten, bis Sie gezogen werden. Wieder lag und nicht eine sehr schöne Erfahrung.
So, dann ist WPF, die möglicherweise dieses problem zu beheben, aber ich/wir sind nicht bereit sich zu bewegen in WPF. Ich bin auf der Suche rund um für workarounds oder fixes, und ich stolperte über Direct2D und beim Lesen auf, dass einige andere Bibliotheken.
Setzen Im ein bisschen verwirrt und so diese Fragen:
1)
Zuerst, was ich möchte, ist eine Recht saubere und einfache Weg, um einfach nur ersetzen GDI+ etwas schneller und die hardware-beschleunigte Ansatz. Ist es möglich zu tun, ohne den Umweg über WPF und ohne neu zu schreiben, alle meine Windows-Forms-code?
Immer, wenn ich etwas zu Lesen auf Direct2D ich sehen lange Blöcke von in der Regel schrecklich C++ - code, der mir sagt, wie das manuelle schreiben von code für das zeichnen. Ich will nicht, dass.
2)
Beim Lesen im Netz, stolperte ich über SlimDX, aber ich kann nicht herausfinden, wie es zu benutzen (und ich gebe zu, ich habe nicht versucht, sehr viel zu schreiben). Können sagen, ich habe bereits eine GUI-Anwendung (Windows Forms, standard C# - code) - kann ich die irgendwie verwenden SlimDX (oder so ähnlich), einfach zu "ersetzen" GDI+ ohne viel umschreiben?
Mein problem ist ich finde keine Beispiele oder so sagen Sie mir, wenn es möglich ist, SlimDX, Direct2D oder andere ähnliche Dinge in meiner bereits erstellten Windows Forms-software, und wenn es möglich ist - wie es zu tun.
Hoffe ich bin nicht zu unscharf =)
==EDIT== 2010-09-22
Habe ich einige tests in meiner realen app, und isoliert man die langsamen Dinge:
Wenn ich text hinzufügen einige Labels in einem UserControl, die Steuerelemente Größe selbst zu passen, der text. Zum Beispiel, die mit GroupControl passt ein bisschen auf die Größe des Textes, die wurde nur Hinzugefügt, um die .Text-Eigenschaft des Labels.
Sind es etwa 10 Label-Steuerelemente. Das erste mal die Beschriftungen werden aktualisiert, und damit sind die Größen geändert, der gesamte Prozess dauert etwa 500 ms. Das zweite mal, dass die Beschriftungen werden aktualisiert, und keine Größe ändert, dauert es etwa 0 ms.
==EDIT 2== 2010-09-22
Einen gefunden, der die slow-downs. Dann das hinzufügen einer Zeichenfolge, die Text-Eigenschaft es ist langsam, wenn der text, der Hinzugefügt wird, unterscheidet sich in der string - Länge aus dem text, dass war es vor dem update.
Im mit DevExpress-Bibliotheken, und LabelControls kann eingestellt werden, um AutoSizeMode. Wenn ich auf "Keine" dann ist der lag Weg gehen wird, wenn Sie text Hinzugefügt haben, unterscheidet sich in der Länge von dem vorherigen text. Ich denke, das problem wird sein, das gleiche für die normale Label-Steuerelement, wie es auch eine AutoSize = true/false einstellen.
Jedoch ist es ein "workaround", aber immer noch beweist mein Punkt - es ist wirklich langsam, wenn die Größe, die ziemlich lahm ist.
Kann wirklich sehen, wie man Dateien hier posten. Aber was ich versucht habe, war zu erstellen-1-Form auf, die form, die ich auf Platz 1 TabControl mit 3 Seiten. Auf jeder Seite werde ich mit Label, TextBox und ComboBox (200 Kontrollen pro tabPage). Ich habe dann einfach auszuführen, klicken Sie auf/zwischen den Seiten umzuschalten und dort können Sie sehen, wie es lag. Das gleiche in normalen apps, nur noch schlimmer in der Regel =(
ich bin mit DevExpress-Bibliotheken - dann der erste test, um zu versuchen, ist die Verwendung von eingebauten standard-Windows-Steuerelemente, um zu sehen, ob Sie schneller sind. IMHO, ist die Tatsache, dass Sie mit einem Drittanbieter-Bibliothek von Steuerelementen sollte in Ihrem ersten Absatz! [Ich habe nun den entsprechenden devexpress tag, hoffentlich machen das noch deutlicher.]
InformationsquelleAutor Ted | 2010-09-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Viele der Poster oben kommen mit guten Punkten. Ich habe eine 3D-CAD-Anwendung in der GDI+ selber, und fand es reichlich schnell genug, wenn es richtig umgesetzt wird. Mithilfe der Steuerelemente, aber sofort kommt mir wie eine sehr ungeschickte Art und Weise, Dinge zu tun. Ein Steuerelement ist ein ziemlich großes Objekt und gibt es zahlreiche Gründe, um Ihre eigene in diesem Fall.
Ich würde Ihnen raten, schauen Sie in ein retained mode zieh-system. Es ist einfach zu implementieren und würde für Ihre situation in den meisten Fällen. Hätten Sie zum erstellen der Zeichnung Logik selbst, aber das ist nur Spaß und würde Ihnen mehr Flexibilität 🙂
Scheint, dass der Kerl zog von Technologie im Jahr 2014: bobpowelldotnet.blogspot.co.uk
Leider, Bob Powell starb vor ein paar Jahren. Seine Website war so ziemlich die beste Ressource, die auf GDI+ Programmierung gibt, und leider ich glaube nicht, dass es eine vollständige Kopie seiner Archiv überall.
Das ist traurig, auf mehreren Ebenen.
Gott sei Dank ist das Internet-Archiv hat einige backups von seiner Arbeit, bevor es übernommen wurde durch Seelenlose internet-Vampire: web.archive.org/web/20120826121342/http://www.bobpowell.net/...
InformationsquelleAutor Pedery
Auf Ihre erste Frage, ich musste mit GDI zu tun, einige Bildverarbeitungs-Zeug, das war unter Alter unter GDI+. Das war vor 4 bis 5 Jahren und arbeiten mit GDI durch den Einsatz von managed C# war eine Qual - nicht sicher, wie viel es hat sich nun geändert. Es gibt viele gute und schnelle Funktionen, wie BitBlt, die sind sehr schnell in der Zeichnung, aber Sie müssen sehr vorsichtig mit der Freigabe von Ressourcen (Griffe) und Speicher. Ich habe auch ein anderes Problem hatte und das war das Ergebnis speichern Sie als JPEG-und es ist nicht existent in der GDI-so musste ich CxImage zu Lesen, HBitmap und speichern Sie es dann.
Alles in allem, GDI ist sehr schnell und robust. Wenn es bessere Abstraktionen in DirectX, bist du wahrscheinlich besser mit Ihnen.
InformationsquelleAutor Aliostad
Ich bin auf der Suche auf einige der gleichen Probleme. Ich Schreibe eine Anwendung, die Sie benötigt, um das Rendern von 2d-Grafiken sehr effizient, da einige Benutzer haben könnte, 10 - 50 Fenster gleichzeitig offen haben. Eine Sache zu prüfen, dass niemand sonst hier die Rede ist, ist die Tatsache, dass direct2d kann nur verwendet werden, auf Computern mit Vista mit service pack 2 und höher. Auch laut diesem link:
http://www.tomshardware.com/news/msft-windows-xp-windows-7-market-share-win7,13876.html
38.5% aller Windows-Anwender wurden immer noch mit XP so Nov, 2011. Also, wenn der Verkauf der app, um eine erhebliche Menge der Nutzer immer noch mit XP arbeiten, ist die Sorge (oder Ihre marketbase ist die 3. - Welt-Ländern, die hauptsächlich mit XP), dann sollten Sie entweder gehen mit:
Direct2d für neuere Betriebssysteme und GDI+ für XP-Systeme.
XNA - die ist kompatibel mit Windows XP und kann auch mit den neueren Betriebssystemen. Finden Sie unter diesem link: http://msdn.microsoft.com/en-us/library/bb203925.aspx
SlimDX - erwähnt in der ersten Antwort. Unterstützt XP als auch für die neueren Betriebssysteme. Siehe:
http://slimdx.org/ und http://slimdx.org/features.php
OpenTK, wenn Sie sich über die Kompatibilität zwischen Windows, Linux, Max, etc.
Sollten Sie sich auch bewusst sein, dass es ein Fehler war, mit GDI+, die es verursacht haben, leiden sehr schlechte Leistung, wenn es war zuerst veröffentlicht. Finden Sie unter den folgenden link, warum einige Entwickler behaupten, dass Microsoft brach die gui für Windows7 für apps mithilfe von GDI+:
http://www.windows7taskforce.com/view/3607
oder führen Sie eine web-Suche auf Ihre Lieblings-Suchmaschine mit dieser Zeichenfolge: "gdi+ Fehler langsam auf windows 7".
InformationsquelleAutor Bob Bryan
Könnten Sie versuchen, managed directx, aber Sie nicht mehr unterstützt wird (verschoben auf XNA). Ehrlich, es sei denn, du hast einen beschissenen computer oder eine Tonne steuert, ich weiß nicht, warum, es wäre hinterher so schlecht. Wenn Sie tun, einige cpu-intensive Sachen, auf Ihrem Haupt-thread, verschieben Sie es auf einen separaten thread. Das ist der einzige andere Grund den ich mir denken kann, dass würde dazu führen dass Art lag.
InformationsquelleAutor Phil Winkel
Verwenden wir SlimDX in unserem C# - app.... Aber wir sind eigentlich 3D. Wir schrieben unsere eigenen 2D-lib werden in der Lage, einfache 2D-Zeichnung. SlimDX ist nur eine leichte wrapper für DirectX. Also du bekommst alle vor-und Nachteile von DirectX. So ist es Ihr problem zum emulieren ist die Grafikkarte, wenn es nicht vorhanden ist.
Wenn Sie möchten etwas zum zeichnen zu offscreen-bitmaps, würde ich gehen für WPF, da ist es gut integriert mit C#, funktioniert meist überall, und beschleunigtes wenn es die hardware zur Verfügung. Sie können kopieren Sie die Ausgabe in eine bitmap verwenden und diese in regelmäßigen GDI/Winforms. Aber es wird nur schneller als GDI+ wenn Sie ziemlich komplexe Sachen (viele Filter -, Misch-Texturen, etc...).
Edit:
In Reaktion auf die Kommentare, baute ich ein kleines Beispiel-Formular. Es ist eine Sekunden lang warten, wenn man die erste Zeit, aber danach ist es entgegenkommend. Langsamer, als ich es erwarten würde, aber mit allen Mitteln nutzbar. Möchte Ted zu kommentieren, wenn das in etwa der Leistung, die er sieht in seiner app.
In diesem Fall WPF ist vielleicht nicht angemessen. Konnte Sie nach ein paar Codes zeigen, was Sie tun, genau das mit den controls? 160 leere Textfelder, 160 Rechtecke, sollte schnell sein in keiner Technologie.
Hey, WPF ist wie gesagt keine option, da es erfordern würde, eine Menge umschreiben, und das ist nicht eine option. Der code ist einfach ein neues Windows Forms-Projekt, 1 TabControl enthält über 160-180 Textfelder. Auf der nächsten TabPage es gibt etwa 200-300 LabelControls und auf der nächsten TabPage über 200 ComboBoxes. Wenn Sie dann ändern TabPage sehen Sie den Effekt deutlich. thx.
200 Textboxen/comboboxes?! Sind Sie sicher, dass Sie nicht besser mit einer datagrid-Art der Kontrolle oder sowas??? Weil ich Frage das Wert, dass so viele Steuerelemente auf einem Formular.
Das ist nicht der Punkt. Seine nur ein Beispiel, um zu zeigen, wie langsam es ist. Das war nur ein test Projekt. In meine normalen apps, die wir benutzen viele verschiedene Steuerelemente, und seine ist SO LANGSAM, es macht mich wanna cry.
InformationsquelleAutor