Zpět na projekty
TUIX v0.3Beta

Naposledy aktualizováno: 2026-05-20

Renderovací pipeline

TUIX renderuje terminálové UI přes vícestupňový pipeline: výpočet geometrie, tvorbu obsahu, kompozici a delta renderování. Všechny fáze běží v C pro maximální výkon.

Fáze pipeline

  1. Výpočet geometrie — vynásobit proporční modifikátory rozměry terminálu
  2. Tvorba obsahu — build_content každého widgetu vytváří pixelový buffer
  3. Kompozice — vrstvení bufferů scén do finálního framebufferu (pořadí malíře)
  4. Delta renderování — hashování řádků, přeskočení nezměněných, výstup pouze změněného ANSI

Výpočet geometrie

Před tvorbou obsahu přepočítá resolver geometrie plovoucí modifikátory widgetů na absolutní souřadnice podle aktuální velikosti terminálu. Ve v0.3 se buffery s platným parent_uid řeší relativně vůči rodičovskému bufferu, což umožňuje parent/child layouty.

buffer.width       = terminal_width  × width_mod
buffer.height      = terminal_height × height_mod
buffer.margin_left = terminal_width  × margin_left_mod
buffer.margin_top  = terminal_height × margin_top_mod

Pokud sestavovač widgetu definuje callback on_resize, zavolá se po výpočtu geometrie s novou šířkou a výškou.

Model pixelu

Každá buňka v bufferu je TuixPixel obsahující: 8bajtový UTF-8 symbol, RGB barvy popředí a pozadí, stylové příznaky (tučné, kurzíva, podtržení, ztlumení) a pole cache kvantizace.

PoleVelikostPopis
sym8 bytesUTF-8 znak (vyplněný nulovými bajty)
styles.fg3 bytesRGB popředí (0–255 na kanál)
styles.bg3 bytesRGB pozadí (0–255 na kanál)
styles.bold1 bytePříznak tučného textu
styles.italic1 bytePříznak kurzívy
styles.underlined1 bytePříznak podtržení
styles.dim1 bytePříznak ztlumeného textu
q_fg, q_bg6 bytesCache kvantizovaných barev (RGB565)
q_cached1 byteZda je kvantizační cache platná

Kompozice

Kompozitor alokuje finální framebuffer o velikosti terminal_width × (terminal_height - 1). Spodní řádek je rezervovaný pro log výstup. Ve v0.3 kompozice používá traversal-chain vrstvení: root buffery se řadí podle z-index a každý parent/child podstrom se projde před vykreslením, aby se zachovalo hierarchické vrstvení.

Bezpečnost hierarchieNeplatné parent linky jsou při kompozici sanitizovány. Self-parent i chybějící parent případy se řeší bezpečně a potomci se při odstranění rodiče bezpečně přepojí.

Delta renderování

Renderer porovnává aktuální snímek s předchozím, aby přeskočil nezměněný obsah:

  1. Hashovat každý řádek pomocí FNV-1a nad surovými (nekvantizovanými) daty pixelů
  2. Porovnat s hashi řádků z předchozího snímku
  3. Zpracovat pouze řádky se změněným hashem
  4. Pro změněné řádky kvantizovat barvy (RGB → RGB565 pomocí předpočítané 128KB LUT)
  5. Seskupit sousední pixely se stejným stylem do jedné SGR escape sekvence
  6. Vysílat nastavení kurzoru (\e[Y;XH) jen když je potřeba (přeskočit pro sekvenční buňky)
  7. Streamovat výstup po 256KB blocích

Režimy barevného výstupu

LUT pro kvantizaci barev mapuje hodnoty RGB565 na nejbližší dostupnou terminálovou barvu. Automaticky se používají tři režimy podle nejlepší shody:

RežimFormátBarvy
ANSI16\e[30-37m / \e[90-97m16 základních terminálových barev
ANSI256\e[38;5;NmPaleta 256 barev
Truecolor\e[38;2;R;G;BmPlné 24-bit RGB (16,7 M barev)

Halfblock renderování (volitelný modul)

Zdrojová distribuce obsahuje halfblock renderer (rendering_halfblocks.c), který používá znak Unicode horního půlbloku (▀ U+2580) pro dosažení 2× vertikálního rozlišení. Dva řádky pixelů jsou zabaleny do jednoho terminálového řádku tak, že se barva popředí použije pro horní polovinu a barva pozadí pro dolní polovinu.

Volitelný modulHalfblock renderer není součástí výchozího buildu. Pokročilí uživatelé jej mohou přidat vložením rendering_halfblocks.c do vlastní konfigurace buildu.

Instrumentace a kompaktace scén

v0.3 přidává instrumentaci aktivity scén a konzervativní API pro kompaktaci. Místo eager globální cache je doporučená strategie data-first: číst statistiky scén a kompaktovat studené scény při splnění prahů.

from tuix.core import scenes

stats = scenes.get_scene_stats(b"main")
freed = scenes.compact_scene_pixels(b"main")
compacted = scenes.compact_cold_scenes(120, 64 * 1024, keep_active_scene=True)

Zpracování změny velikosti

Rozměry terminálu se čtou v každém snímku pomocí API specifických pro platformu (ReadConsoleScreenBufferInfo na Windows, ioctl TIOCGWINSZ na POSIX). Při detekci změny velikosti kompozitor realokuje svůj statický finální buffer, přepočítají se geometrie všech widgetů a spustí se kompletní překreslení.