GDI+ performance tricks
Kennt jemand eine zuverlässige (und hoffentlich umfangreiche) Bücher/websites über GDI+ performance (außer den offensichtlichen)?
Zum Beispiel, vor kurzem stieß ich auf diese ausgezeichnete experiment. Ich habe auch vor kurzem bemerkt, dass Graphics.FillPath()
ist Weg, Weg, schneller als Graphics.DrawPath()
. Ich würde gerne wissen, was andere wichtige bits von Informationen, die ich bin fehlt.
Goodwill,
David
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hmmm. Es gibt keinen Gewinn in dem wissen, dass FillPath ist schneller als DrawPath, wenn Sie benötigen, zeichnen Sie die Kontur des Pfades!
Den besten Weg zur Optimierung von GDI+ ist genau das gleiche wie für jeden anderen code ein: Erstens, nicht optimieren. Stattdessen:
Sobald Sie getan haben, all diese Dinge können Sie beginnen, auf der Suche nach Büchern über die Optimierung des rendering. Wenn es immer noch zu langsam, natürlich. Führen Sie einen profiler, um herauszufinden, welche Teile der Darstellung sind die langsamsten.
Wo Sie denken, Sie könnten in der Lage sein, Gewinne zu machen, versuchen Sie verschiedene Möglichkeiten der Erbringung Dinge (z.B. ist es wahrscheinlich, dass Grafiken.Clear() viel schneller als das Befüllen der hintergrund mit FillRectangle()), oder unterschiedliche rendering-Aufträge (zeichnen Sie alle die Dinge, die einer Farbe der erste, bei Status-änderungen Kosten Sie Zeit - Dosier-Operationen ist oft sehr wichtig, mit modernen Grafikkarten. Ein einzelner Aufruf, der zieht mehrere Polygone ist in der Regel schneller, als die Herstellung mehrerer single-polygon-Anrufe, so können Sie sammeln alle Ihre polys in ein deferred-rendering-Puffer und dann Begehen Sie alle am Ende Ihrer rendering-pass?)
Danach können Sie haben, die Verwendung von GDI oder DirectX, um näher an der hardware.
Dies ist vielleicht nicht die Antwort, die du suchst, aber Bedenken Sie nicht mit GDI+ auf alle. Ich hatte bis vor kurzem schreiben Sie die rendering-stack für ein 2D-CAM-Anwendung und die wichtigste Voraussetzung war, um eine gute anti-Aliasing von Linien fallen (das anti-aliasing wurde, was uns dazu veranlasst, zu schreiben, die vorhandenen GDI-renderer).
Hier sind einige Ergebnisse hab ich mit einem render von 200 Elementen (jedes Element ist selbst einige Linien und kleine gefüllte-Form-Marker). Dies sind die frame-raten (auf Windows 7), also mehr ist besser:
200 Elemente:
GDI=51, GDI+=20, D2D=59, WPF=33, GL=59.
(D2D ist Direct2D, GL ist OpenGL). Schon können Sie sehen, dass GDI+ ist trailing. WPF ist vielleicht behindert, in eine retained mode API, aber dann OpenGL ist doppelt gepuffert, so gut und sieht so glatt ist.
Bei 1000 Elementen, der Unterschied ist mehr markiert:
GDI=23, GDI+=5, D2D=17, WPF=2, GL=40.
Richtig, WPF gefallen hat 2 FPS von jetzt, und GDI+ ist kriechend bei 5 FPS. So betrachten D2D, oder gehen Sie einfach zurück zu OpenGL. Das ist es, was wir jetzt verwenden und 3 Monate in die umschreiben, ich denke, dass wir die richtige Wahl getroffen. Die Programmierung Modell selbst ist viel sauberer als bei D2D zu sein scheint.
Beachten Sie, dass die WPF gerendert, das wir verwenden, ist hoch optimiert; keine Rückrufe, keine Veranstaltungen, keine Bindung. Wir bekommen nur einen DrawingContext und zeichnen alles auf jedes frame mit der niedrigsten Stufe, primitive, so ist es kein Ereignis overhead.
Wenn Sie interessiert sind, lassen Sie mich wissen, und ich senden können Sie die test-Suiten, die ich verwendet, so können Sie hantieren herum.
(Ein Grund, warum ich vielleicht meiden von GDI+ ist, dass es unwahrscheinlich ist, jemals die hardware-beschleunigt).