c # - Hurtigste API til gengivelse af tekst i Windows Forms?

Indlæg af Hanne Mølgaard Plasc

Problem



Vi skal optimere tekstgengivelsen til en C # Windows Forms-applikation, der viser et stort antal små strenge i et uregelmæssigt gitter. Når som helst kan der være godt over 5000 celler synlige, som opdateres 4 gange pr. Sekund. Skrifttypefamilien og størrelsen er konsistente på tværs af cellerne, selv om farven kan variere fra celle til celle, som det vil være fed/kursiv/almindeligt. [3]


Jeg har set modstridende oplysninger på nettet om TextRenderer.DrawText vs Graphics.DrawString er den hurtigste/bedste, hvilket reducerer til en GDI vs GDI + sammenligning på Win32-niveauet. [4] [5] [6]


Jeg har også set radikalt forskellige resultater på Windows XP versus Windows Vista, men mit hovedmål er Windows XP. Artikler lovende store fremskridt
under WinFX og DirectX 10 er det ikke nyttigt her: -) [7] [8]


Hvad er den bedste tilgang her? Jeg er ikke bange for at introducere et lille C + +/CLI-lag og optimere enhedens konteksthåndtering for at presse ud mere ydeevne, men jeg vil gerne have nogle endelige råd om, hvilken retning der skal tages.


REDIGERE:
Tak for de første svar. Jeg vil forsøge en kombination af baggrundsbitmapgengivelse og klæbe med GDI-tilsvarende opkald.

Bedste reference


En Microsoft-udvikler har skrevet en GDI vs GDI + Tekstgengivelsesydelsesartikel på sin blog, der svarer på spørgsmålet om råhastighed: GDI DrawText var på sit system ca. 6 gange hurtigere end GDI + DrawString. [9]


Hvis du har brug for at være en ægte hastighedsdemant, er TextOut hurtigere end DrawText, men du skal sørge for klipning og ordindpakning selv. ExtTextOut understøtter klipning.


GDI-gengivelse (TextRenderer) vil være mere konsistent med andre dele af Windows ved hjælp af GDI; GDI + forsøger at være enhedsuafhængig og så er afstanden og udfoldelsen inkonsekvent. Se SQL Server 2005-overfladearealkonfigurationsværktøjet til et eksempel på inkonsekvent gengivelse. [10]

Andre referencer 1


5000+ tekstgengivelse er langsom selv med GDI, især hvis du har brug for at rulle. Opret en separat renderingstråd og meddeler brugergrænsefladen hver 200 ms og bitblt de aktuelle resultater. Det giver en jævn brugeroplevelse.

Andre referencer 2


GDI er hurtigere ved at tegne generelt GDI +. Jeg arbejdede på et projekt, der skulle tegne tusindvis af linjer og tekststrenge, og skift fra GDI + til GDI gjorde en betydelig forbedring af ydeevnen. Det bruger Windows XP, så jeg kan ikke kommentere Vista. Jeg vil også anbefale at bruge dobbelt buffering til din tegning for også at forbedre ydeevnen. Opret en kompatibel offscreen-bitmap og genbrug den, hver gang du skal tegne.

Andre referencer 3


Oprettelse af en C ++/CLI interop klasse for at tegne tegningen i indbygget kode vil resultere i en skøre hurtig tegning. Vi har vidne til dette og målt det.


Hvis du ikke gør det, har vi fundet grafik. TrawString er bare lidt hurtigere end end TextRenderer.DrawText.

Andre referencer 4


På mit Windows 7 64 Bit-system er TextOut endda lidt langsommere end DrawString! TextRenderer.DrawText er meget langsommere end DrawString.