Skip to content

Instantly share code, notes, and snippets.

@deejayy
Last active October 7, 2025 17:36
Show Gist options
  • Save deejayy/1b299784ee09b548236539933d3e7c65 to your computer and use it in GitHub Desktop.
Save deejayy/1b299784ee09b548236539933d3e7c65 to your computer and use it in GitHub Desktop.

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment