Küzdelem a Windows konzollal – avagy hogyan nem rajzolunk betűket 2025-ben
Amikor elkezdtem betűket és karaktereket kirakni a Windows konzolra, az volt a célom, hogy egy gyors, alacsony szintű „renderer”-t készítsek. Valami olyasmit, mint a régi DOS-os, karakteres felületű játékok vagy demók, csak modern megközelítéssel: Unicode, színek, akár 144 Hz fölötti frissítés. A konzolnak elvileg alkalmasnak kellene lennie erre – hiszen képes szöveget és színeket kezelni –, de a gyakorlatban kiderült, hogy a Windows konzol mélyen a múltban ragadt.
Először a klasszikus WriteConsoleOutputW
API-t próbáltam, ami egy nagy sebességű, rácsos memóriaművelet: egyetlen hívással akár több ezer karaktert és színt is ki lehet írni. A teljesítmény kiváló volt, de gyorsan kiderült, hogy az API nem támogatja a modern Unicode-karaktereket, például az emojikat. A karakterrács ugyanis fixen egyetlen UTF-16 kódot tárol cellánként, így minden, ami surrogate-párt igényel, egyszerűen szétesik.
Ezután jött a WriteConsoleW
, ami már képes volt az emojik megjelenítésére, viszont cserébe drámai sebességveszteséget tapasztaltam. Színek nélkül még elfogadható volt a sebesség, de amint színeket is próbáltam állítani, a teljesítmény a WriteConsoleOutputW
-hoz képest húsz százalékra esett vissza. Később egy hibrid megoldással kísérleteztem: a színeket a gyors WriteConsoleOutputW
, a szöveget pedig a Unicode-képes WriteConsoleW
írta ki. Ez már majdnem tökéletesnek bizonyult, viszont a WriteConsoleW
minden esetben felülírja a cellák attribútumait, így a színezés elvész – hiába nem küldtem semmilyen színkódot.
Több irányt is megnéztem: a VT (ANSI) escape szekvenciák modern támogatását, illetve a DirectWrite/Direct2D vonalat is. A VT-mód ugyan hozza a teljes Unicode-kompatibilitást, de rengeteg felesleges feldolgozást igényel, és adatforgalomban is nehézkes. A DirectWrite már valóban GPU-gyorsított és szövegformázásra született, de egy külön ablakot, COM-interfészeket és sokkal több kódot jelent – gyakorlatilag nem „konzolos” megoldás többé.
Összességében 2025-ben a Windows konzol még mindig elsősorban szöveges kimenetre alkalmas, nem pedig grafikus vagy nagy sebességű „renderer”-re. Kiváló eszköz logok, interaktív parancssori eszközök és fejlesztői kimenetek megjelenítésére, de nem való nagy frissítési frekvenciájú, színes-Unicode megjelenítésre. Aki ilyesmire vágyik, annak ma már a grafikus DirectWrite/D2D megoldás az út – a klasszikus Win32 konzol API pedig marad annak, aminek eredetileg tervezték: karakteres terminálnak.