2010-01-13 8 views
6

Eine Anwendung, an der unser Unternehmen gerade arbeitet, zeigt viele Rechteckformen mit Farbverläufen zum Zeichnen von "Tiles" an. Es entstand eine interne Diskussion, die eine Frage der Leistung stellte. Diese Kacheln haben eine Größe von etwa 100 mal 200 Pixel und sind entweder rot, gelb oder grün schattiert. Zu jeder Zeit können bis zu 100 dieser Kacheln auf dem Bildschirm angezeigt werden. Wäre es für uns performanter, ein Bild für jedes Bild (rot, gelb, grün) zu erstellen und es bei Bedarf zu wiederholen, oder wäre es besser für uns, sie weiterhin mit WPF-Standardpinseln zu zeichnen?Rendern viele wiederholte Bilder mehr oder weniger performant als mit Pinsel in WPF?

BEARBEITEN: Um zu verdeutlichen, ist die Farbverlaufsbürste, die wir verwenden, ein LinearGradientBrush.

+0

Mit welcher Leistungsmetrik sind Sie am meisten beschäftigt? Geschwindigkeit, Speichernutzung, CPU-Auslastung usw. –

+0

Grafikleistung, CPU-Auslastung usw. Wenn ich durch eine Liste von Hunderten solcher Verlaufskacheln scrolle, merke ich Bildschirmflimmern und hohe CPU-Auslastung. Wir haben ein paar Dinge ausprobiert, um die Leistung zu verbessern, aber ohne Glück. Ich habe mich gefragt, ob die Verwendung von gerasterten Bildern stattdessen helfen würde. – Kilhoffer

+0

Flimmern und hohe CPU-Auslastung für nur ein paar hundert dieser Kacheln? Welche Art von Objekten erstellst du für die Kacheln? Erstellen Sie vollwertige FrameworkElements oder UIElements oder arbeiten Sie mit der Visual-Klasse auf niedrigerer Ebene? – Charlie

Antwort

1

Aus Erfahrung wird das Zeichnen mit Pinseln eine weitaus bessere Leistung haben. Der Aufwand, die Kachelbilder hochzuladen und zu rendern, ist im Vergleich zum Rendern gefüllter Rechtecke groß.

+0

Können Sie mir technische Gründe dafür nennen, warum Gradient Brushsperform besser ist? Wenn ja, ist das Kopfgeld ganz bei Ihnen. – Kilhoffer

+0

Technische Gründe sind ziemlich einfach. IO ist immer einer der teuersten Vorgänge, die Sie ausführen können. Das Lesen von Bildern aus Dateien wird Zeit brauchen; Etwas ohne diesen Overhead zu rendern, wird weniger Zeit brauchen. Sobald Sie den tatsächlichen Rendering-Code getroffen haben, wird es auf dasselbe hinauslaufen (hoch optimiertes DirectX), aber der Unterschied ist, dass der Pinselansatz keinen Overhead hat, um das Bild zu erzeugen. – Charlie

+0

Tut mir leid, ich hätte das in meinem Post erwähnen sollen. Ich werde entsprechend bearbeiten. Es gibt nur 3 Bilder, die wiederholt werden würden. Das einzige IO liest sie zum ersten Mal. Danach sind sie zwischengespeicherte Ressourcen. – Kilhoffer

1

Die einzige Möglichkeit, dies aufzuklären, wäre, es auf beide Arten zu versuchen und die Leistung jedes Ansatzes zu messen.

Sie müssten Code hinzufügen, um die Render-Schleife zeitlich festzuhalten und das Ergebnis in Datei zu protokollieren, und dann eine 1000 (oder sogar 100000) Neuzeichnung erzwingen, um eine realistische Figur zu erhalten.

Mein Gefühl ist, dass die LinearGradientBrush wäre schneller als das Laden eines Bildes (auch aus Ressourcen) - aber ich bin bereit, falsch bewiesen werden.

Verwandte Themen