2008-09-16 11 views
12

Wir müssen das Text-Rendering für eine C# Windows Forms Anwendung optimieren, die eine große Anzahl kleiner Strings in einem unregelmäßigen Raster anzeigt. Zu jeder Zeit können weit über 5000 Zellen sichtbar sein, die 4 mal pro Sekunde aktualisiert werden. Die Schriftfamilie und -größe ist in allen Zellen konsistent, obwohl die Farbe von Zelle zu Zelle variieren kann, ebenso wie fett/kursiv/plain.Schnellste API zum Rendern von Text in Windows Forms?

Ich habe widersprüchlichen Informationen im Internet gesehen zu TextRenderer.DrawText vs. Graphics.DrawString die schnellsten/besten, was zu einem GDI vs. GDI+ Vergleich auf Win32 Ebene reduziert.

Ich habe auch radikal andere Ergebnisse auf Windows XP im Vergleich zu Windows Vista gesehen, aber mein Hauptziel ist Windows XP. Artikel vielversprechende große Fortschritte unter WinFX und DirectX 10 sind hier nicht hilfreich :-)

Was ist der beste Ansatz hier? Ich habe keine Angst davor, eine kleine C++/CLI-Schicht einzuführen und die Gerätekontextbearbeitung zu optimieren, um mehr Leistung herauszuholen, aber ich hätte gerne einen definitiven Ratschlag, welche Richtung einzuschlagen ist.

EDIT: Danke für die ersten Antworten. Ich werde eine Kombination aus Hintergrund-Bitmap-Rendering und Kleben mit den GDI-äquivalenten Anrufen versuchen.

Antwort

5

Ein Microsoft-Entwickler hat einen GDI vs. GDI+ Text Rendering Performance Artikel in seinem Blog veröffentlicht, der die Frage der rohen Geschwindigkeit beantwortet: GDI DrawText war auf seinem System etwa 6 mal schneller als GDI + DrawString.

Wenn Sie ein echter Geschwindigkeitsdämon sein müssen, ist TextOut schneller als DrawText, aber Sie müssen sich um Clipping und Wortumbruch kümmern. ExtTextOut unterstützt Clipping.

GDI-Rendering (TextRenderer) wird konsistenter mit anderen Teilen von Windows mit GDI sein; GDI + versucht, geräteunabhängig zu sein, und some spacing and emboldening are inconsistent. Ein Beispiel für inkonsistentes Rendering finden Sie im SQL Server 2005-Oberflächenkonfigurationsprogramm.

+0

Die Beispiel-App im Blog-Link ist die, die ich verwendet habe, als ich den großen Unterschied zwischen Vista und XP sah - auf meinem Vista-PC waren GDI und GDI + gleich, während auf XP ich den 6x Unterschied sehe, den der Autor erwähnt. Dies ist wahrscheinlich ein Vista-Treiber-Problem, aber einige der Schwierigkeiten hier hervorgehoben - danke! –

+1

Historischer Hinweis: ExtTextOut war früher der schnellste Weg, um ein festes Rechteck auf einigen Karten/Treibern zu zeichnen :) –

2

GDI ist schneller beim Zeichnen im Allgemeinen, dass GDI +. Ich arbeitete an einem Projekt, das Tausende von Zeilen und Textzeichenfolgen zeichnen musste, und der Wechsel von GDI + zu GDI führte zu einer deutlichen Leistungsverbesserung. Das war Windows XP, also kann ich Vista nicht kommentieren. Ich würde auch empfehlen, doppelte Pufferung für Ihre Zeichnung zu verwenden, um auch die Leistung zu verbessern. Erstellen Sie eine kompatible Off-Screen-Bitmap und verwenden Sie sie jedes Mal neu, wenn Sie zeichnen müssen.

3

5000+ Text Rendering ist langsam sogar mit GDI, besonders wenn Sie scrollen müssen. Erstellen Sie einen separaten Rendering-Thread und benachrichtigen Sie den Benutzeroberflächenthread alle 200 ms, und blenden Sie die aktuellen Ergebnisse ein. Es bietet eine reibungslose Benutzererfahrung.

2

Das Erstellen einer C++/CLI-Interop-Klasse für die Zeichnung in nativem Code führt zu einem verrückten Zeichnen. Wir haben dies beobachtet und gemessen.

Wenn Sie das nicht tun, haben wir Grafik gefunden.DrawString ist nur etwas schneller als als TextRenderer.DrawText.

2

Auf meinem Windows 7 64 Bit System ist TextOut sogar etwas langsamer als DrawString! TextRenderer.DrawText ist viel langsamer als DrawString.

+1

Ich entdeckte das auch ... aber ich kann keinen Grund finden warum !? – series0ne