GPU 가속 터미널: TTY에서 글리프 아틀라스까지
Ghostty, Alacritty, WezTerm, Kitty 같은 GPU 가속 터미널의 동작 원리와 내 워크플로에 맞는 터미널 고르는 법을 정리했습니다.

1978년 Digital Equipment Corporation은 VT100을 출하했습니다. 베이지색 케이스에 담긴 CRT를 시리얼 케이블로 미니컴퓨터에 연결하는, 거의 가구에 가까운 장비였죠. 프로그램을 실행하지도, 그래픽을 그리지도 못했습니다. 80열 24행의 고정된 격자에 텍스트만 표시했고, 그것이 사람과 실행 중인 시스템을 잇는 인터페이스의 전부였습니다. 거의 50년이 지난 지금도 개발자가 하루종일 들여다보는 화면은 개념적으로 여전히 그 격자입니다. 하지만 그 밑의 아키텍처는 VT100 설계자들이 상상도 못 했을 방식으로 바뀌었습니다. Ghostty, Alacritty, Kitty, WezTerm 같은 최신 터미널 에뮬레이터는 원래 비디오 게임을 위해 만들어진 GPU 렌더링 파이프라인으로 텍스트를 내보냅니다. 그리고 성능 차이는 점진적인 수준이 아니라 구조적입니다.
기본 터미널이 병목이 되는 이유
macOS의 Terminal.app, Linux의 GNOME Terminal, Windows의 Console Host는 운영체제와 함께 제공되고 잘 동작합니다. 한동안은 이것으로 충분했습니다. 명령어를 입력하고, 출력을 읽고, 다음으로 넘어가면 됐으니까요. 하지만 지금의 개발 워크플로는 그렇지 않습니다. 장황한 빌드 로그를 스트리밍하고, lazygit이나 btop처럼 키를 누를 때마다 화면 전체를 다시 그리는 TUI 앱을 돌리고, AI 코딩 도구의 구조화된 출력을 파이프로 받고, 여러 패널에 동시에 쏟아지는 출력을 관리합니다. 레거시 터미널은 이런 용도를 전제로 설계된 적이 없습니다.
근본 원인은 단순합니다. CPU 중심 렌더링이죠. 레거시 터미널은 문자를 순차적으로 처리하는 플랫폼 텍스트 API로 글자를 그립니다. 테스트 스위트가 만 줄을 한꺼번에 쏟아내면, 터미널은 모든 글리프를 CPU에서 래스터화하고, 프레임버퍼에 합성한 뒤, 그 결과를 디스플레이로 보내야 합니다. 이 모든 작업이 메인 스레드에서 일어납니다. 프레임이 떨어지고, 입력 지연이 튀고, 스크롤백이 굼떠집니다. 큰 파일을 cat으로 출력할 때 반 초쯤 멈추는 그 느낌, 다들 아시죠.
이건 사소한 불편이 아닙니다. 입력 지연은 생각하는 속도에 직접 영향을 줍니다. 키 입력부터 화면 표시까지의 지연을 연구한 자료에 따르면 10밀리초를 넘으면 체감되고, 50밀리초를 넘으면 타이핑 속도가 눈에 띄게 떨어집니다. 에디터 자체 렌더링에 터미널이 20~30ms를 더 얹으면, 필요한 것보다 실제로 느리게 생각하고 있는 셈입니다.
GPU 가속 터미널 렌더링은 실제로 어떻게 동작할까
텍스트를 GPU에 보낸다고 하면 압정을 망치로 박는 것처럼 들릴 수 있습니다. 고정폭 문자를 격자에 찍는 게 얼마나 어렵겠냐고요. 하지만 GPU 가속 터미널의 핵심은 텍스트 렌더링이 어렵다는 데 있지 않습니다. GPU는 같은 작은 연산을 수천 번 병렬로 처리하는 데 엄청나게 뛰어나고, 터미널 렌더링이 바로 그런 작업입니다. 한 프레임마다 수천 개의 셀에 글리프 크기의 동일한 텍스처를 찍어 넣는 일이니까요.
핵심 기법은 글리프 아틀라스입니다. 어떤 문자가 처음 나타나면, 터미널은 플랫폼에 따라 FreeType, CoreText, DirectWrite 중 하나를 사용해 그 글자를 래스터화하고, 결과 비트맵을 GPU 텍스처 아틀라스에 저장합니다. 미리 렌더링된 문자들이 담긴 거대한 스프라이트시트라고 생각하면 됩니다. 이후 프레임마다 그 문자를 표시하는 건 텍스처 조회와 쿼드 그리기 한 번이 전부입니다. 래스터화도 없고, 그리드 데이터를 넘기는 것 말고는 CPU가 관여할 일도 없습니다. 게임 엔진이 3D 씬에서 텍스트를 그리는 데 수십 년 동안 써 온 기법과 같습니다.
Terminal Rendering Pipeline:
PTY byte stream
→ VT parser (interprets ANSI escape sequences)
→ Cell grid (char + fg color + bg color + attributes per cell)
→ Glyph atlas lookup (GPU texture coordinates for each character)
→ Batch draw calls (one draw per distinct texture/color combination)
→ GPU compositing (text + cursor + selection + background effects)
→ Displayed frame
The expensive step in legacy terminals — per-glyph CPU rasterization —
becomes a cache hit in the atlas. That's the whole trick.
렌더링 API는 플랫폼마다 다릅니다. Alacritty와 WezTerm은 Linux에서 OpenGL, macOS에서 Metal을 사용합니다. Ghostty는 macOS에서 자체 Metal 백엔드를 쓰고, Linux에서는 Vulkan을 지원합니다. Kitty는 어디서나 OpenGL을 씁니다. 이 선택은 이식성과 드라이버 호환성에 영향을 주지만, 모든 방식이 공유하는 근본적인 장점은 같습니다. 프레임마다의 래스터화를 GPU가 거의 공짜로 처리하는 배치 텍스처 샘플링 문제로 바꿔 놓는다는 것입니다.
GPU 가속 터미널 비교: Ghostty, Alacritty, WezTerm, Kitty
이 네 가지 터미널은 렌더링 철학을 공유하지만, 나머지 대부분에서는 확연히 갈립니다. 각각은 터미널은 무엇을 책임져야 하는가라는 질문에 다른 답을 내놓았습니다.
Ghostty: 네이티브 UI, 타협 없음
Mitchell Hashimoto의 Ghostty는 Zig로 작성되었고, 플랫폼 네이티브 UI와 통합됩니다. macOS에서는 AppKit과 Metal, Linux에서는 GTK를 씁니다. 대부분의 크로스 플랫폼 터미널은 어느 OS에서나 똑같이 느껴지는데, 이는 곧 어느 OS에서도 낯설게 느껴진다는 뜻이기도 합니다. Ghostty는 창 관리, 키보드 단축키, 시각적 스타일링에 대해 각 플랫폼의 관례를 존중합니다. macOS에서는 macOS 앱처럼, GNOME에서는 GNOME 앱처럼 느껴집니다. 겉보기에는 사소한 문제 같지만, 가장 오래 쓰는 애플리케이션이 터미널이라면 이 네이티브한 느낌은 몇 달에 걸쳐 쌓여 큰 차이를 만듭니다.
Alacritty: 한 가지를 하고, 빠르게 한다
Alacritty는 GPU 가속 터미널 흐름을 시작한 프로젝트입니다. Rust로 작성되었고, 탭, 분할, 내장 멀티플렉싱을 의도적으로 뺐습니다. 철학은 유닉스다운 방식입니다. 한 가지를 잘하고 나머지는 다른 도구에 맡기라는 것이죠. 이미 tmux나 타일링 윈도우 매니저를 쓰고 있다면, Alacritty는 가장 빠른 렌더링을 가장 작은 리소스로 제공합니다. 기능 비교에서 이기지는 못하지만, 그게 바로 핵심입니다.
WezTerm: 모든 기능을 제대로 담다
WezTerm은 정반대의 입장을 취합니다. 내장 멀티플렉싱, SSH 통합, Lua 기반 설정, 리가처 지원, 이미지 렌더링까지, 기능을 최대한 담은 터미널입니다. Lua 스크립팅 엔진은 정말 강력합니다. 조건부 키 바인딩, 동적 탭 제목, 워크스페이스 전환 로직을 직접 작성할 수 있는데, 다른 환경에서는 도구 서너 개를 엮어야 하는 일입니다. 터미널, 멀티플렉서, dotfile 스크립트 절반을 한 애플리케이션으로 대체하고 싶다면 WezTerm부터 써 볼 만합니다.
Kitty: 프로토콜의 개척자
Kitty가 남긴 가장 오래가는 기여는 렌더링 엔진이 아니라 프로토콜입니다. Kitty 그래픽 프로토콜은 애플리케이션이 래스터 이미지를 인라인으로 표시할 수 있게 해 줍니다. Kitty 키보드 프로토콜은 수십 년 된 키 입력 모호성 문제를 드디어 해결합니다. 레거시 터미널에서 Ctrl+I와 Tab을 구별해 보세요. 불가능합니다. 이 프로토콜들은 다른 터미널과 Textual, Ratatui 같은 TUI 프레임워크에도 채택되었습니다. Kitty는 생태계 전체를 앞으로 밀어 올렸고, 지금 쓰는 도구들이 나아진 데에는 Kitty의 공이 있습니다.
터미널 성능 벤치마크: 무엇이 중요하고 무엇이 아닌가
터미널 벤치마크는 잘못하기 쉽습니다. 거대한 파일을 터미널에 cat으로 출력하고 시간을 재면 처리량은 측정되지만, 일상 경험에 영향을 주는 지표는 아닙니다. 실제로 중요한 숫자는 세 가지입니다.
- 입력 지연: 키를 누르고 화면에 보이기까지의 시간입니다. GPU 터미널은 일관되게 2~5ms를 기록합니다. 레거시 터미널은 15~30ms 수준입니다. 타이핑할 때마다 이걸 느끼게 됩니다.
- 프레임 일관성: 평균 FPS뿐 아니라 편차도 중요합니다. 60fps로 렌더링하다가 대량 출력 중에 15fps로 떨어지는 터미널은, 안정적으로 30fps를 유지하는 터미널보다 더 나쁘게 느껴집니다. GPU 합성은 화면에서 얼마나 많은 부분이 바뀌든 렌더링 비용이 거의 일정하기 때문에 여기서 유리합니다.
- 유휴 리소스 사용량: 셸 프롬프트만 띄워 둔 터미널이 의미 있는 CPU를 쓰면 안 됩니다. 일부 GPU 터미널은 불필요한 다시 그리기 때문에 유휴 전력 소모 문제가 초기에 있었지만, 대부분 해결되었습니다. Alacritty와 Ghostty는 보통 30~60MB 메모리에서 유휴 상태를 유지합니다. WezTerm은 Lua 런타임 때문에 80~150MB를 씁니다.
# Quick throughput test — not the most important metric,
# but reveals rendering architecture differences
time seq 1 1000000 | head -c 10M > /dev/null # baseline
time seq 1 1000000 # terminal-limited
# Measure input latency with Typometer (Java) or similar
# https://github.com/pavelfatin/typometer
#
# Typical results on modern hardware:
# Ghostty: 2-4ms
# Alacritty: 2-4ms
# Kitty: 3-5ms
# WezTerm: 4-6ms
# Terminal.app: 15-25ms
# GNOME Term: 20-30ms
# For frame consistency, vtebench is the best tool:
# https://github.com/alacritty/vtebench
vtebench --benchmark scrolling --iterations 100
가장 빠른 터미널이 반드시 가장 좋은 터미널은 아닙니다. 실제로 일하는 방식과 트레이드오프가 맞는 터미널이 가장 좋습니다. tmux를 능숙하게 쓰는 사람, 네이티브 분할을 쓰는 사람, VS Code 통합 터미널에 사는 사람은 각자 필요한 것이 다릅니다.
내장 멀티플렉싱 vs. tmux: 실용적인 관점
이건 논쟁을 시작하게 만드는 질문입니다. 터미널이 분할과 탭을 처리해야 할까, 아니면 tmux에 맡겨야 할까? 애매하게 얼버무리지 않겠습니다. 두 방식 모두 좋고, 정답은 한 가지 변수에 달려 있습니다. 세션 유지가 필요한가요?
tmux 세션은 터미널이 크래시 나거나 SSH 연결이 끊겨도 살아남습니다. 네이티브 분할은 그렇지 않습니다. 운영 서버에 SSH로 접속해서 분리했다가 다시 붙여야 한다면 tmux는 타협할 수 없는 선택입니다. 이 일을 이만큼 안정적으로 하는 도구는 없습니다.
하지만 로컬 개발에서는 네이티브 멀티플렉싱에 실질적인 장점이 있습니다. 네이티브 분할은 GPU 합성으로 처리됩니다. 터미널이 모든 패널을 하나의 프레임에 직접 렌더링하죠. GPU 터미널 안에서 tmux를 돌리면 렌더링이 두 번 일어납니다. tmux가 가상 화면을 문자 버퍼에 그리고, 터미널이 그 버퍼를 다시 GPU로 렌더링합니다. 성능 세금을 내는 셈이고, tmux가 애플리케이션과 터미널 사이에 끼어 있어서 인라인 이미지나 Kitty 키보드 프로토콜 같은 최신 터미널 기능도 깔끔하게 전달되지 않아 잃게 됩니다.
실용적인 방법은 하이브리드입니다. 로컬 작업에는 네이티브 분할을, 원격 세션에는 tmux를 씁니다. 한 도구에 두 가지 일을 억지로 맡기지 말고, 상황마다 맞는 도구를 쓰세요.
새로운 워크플로를 가능하게 하는 최신 터미널 프로토콜
VT100은 수십 년 동안 터미널이 지원해 온 이스케이프 시퀀스 집합을 정의했습니다. 최신 터미널은 그 시퀀스를 확장해서, 원래 설계자들이 상상하지 못한 워크플로를 가능하게 합니다.
Kitty 그래픽 프로토콜이나 Sixel을 통한 인라인 이미지 렌더링 덕분에 CLI 도구가 브라우저나 별도 창을 열지 않고도 차트, diff, 다이어그램을 보여 줄 수 있습니다. 데이터 과학 도구는 터미널 안에 바로 그래프를 그릴 수 있고, AI 코딩 어시스턴트는 시각적 결과를 인라인으로 보여 줄 수 있습니다. 직접 써 보기 전에는 장난처럼 들리지만, 써 보고 나면 당연하게 느껴집니다.
동기화된 출력(모드 2026, 우연히도)은 애플리케이션이 화면 업데이트를 원자적 프레임으로 묶을 수 있게 합니다. 이게 없으면 파일 매니저, 대시보드, 텍스트 에디터처럼 전체 인터페이스를 다시 그리는 TUI 앱에서 깜빡임이 보입니다. 터미널이 도착하는 이스케이프 시퀀스를 하나씩 그리기 때문입니다. 동기화된 출력을 쓰면 터미널은 시작 마커와 끝 마커 사이의 모든 내용을 버퍼에 쌓았다가 한 번에 그립니다. Ratatui와 Textual은 터미널이 지원하면 이를 자동으로 활성화합니다.
# Test Kitty keyboard protocol support
printf '\e[?u' # Query keyboard protocol flags
# Test Kitty graphics protocol support
printf '\e_Gi=31,s=1,v=1,a=q,t=d,f=24;AAAA\e\\'
# Synchronized output — bracket your screen updates
printf '\e[?2026h' # Begin synchronized update
# ... application writes to screen ...
printf '\e[?2026l' # End — terminal renders everything at once
Kitty 키보드 프로토콜은 특별히 주목할 만합니다. 터미널의 키보드 처리는 40년 동안 고장 나 있었습니다. VT100은 Ctrl+I와 Tab을 같은 바이트(0x09)로 인코딩했습니다. Escape와 Alt 조합 키는 모두 0x1b로 시작합니다. Kitty 프로토콜은 이를 모호함 없는 키 이벤트 보고로 대체합니다. 누름, 뗌, 반복과 전체 수정자 정보를 제공합니다. Neovim, Helix 같은 에디터는 이미 지원합니다. Ctrl+Shift+Enter가 독립된 바인딩으로 제대로 동작하는 터미널을 한 번 써 보면, 다시는 돌아갈 수 없습니다.
실사용을 위한 GPU 가속 터미널 설정
빠른 터미널을 설치하고 기본값으로 실행하면 혜택의 30% 정도만 얻습니다. 나머지는 설정에서 나옵니다. 실제로 중요한 것들을 정리하면 다음과 같습니다.
폰트 선택은 가독성, 글리프 아틀라스 크기, 리가처 동작에 영향을 줍니다. JetBrains Mono, Fira Code, Monaspace는 리가처를 지원하는 인기 있는 선택지입니다. Nerd Font 변형을 쓰면 셸 프롬프트, 파일 매니저, git 도구에서 아이콘을 볼 수 있습니다. Ghostty, WezTerm, Kitty는 모두 리가처를 지원합니다. Alacritty는 리가처가 코드에서 시각적 방해물이라는 입장으로 의도적으로 지원하지 않습니다.
# Ghostty config (~/.config/ghostty/config)
font-family = "JetBrains Mono"
font-size = 14
adjust-cell-height = 2
font-feature = "calt"
font-feature = "liga"
background-opacity = 0.95
theme = "catppuccin-mocha"
scrollback-limit = 100000
# Shell integration — Ghostty auto-injects on macOS,
# but you may need this on Linux:
# source "$GHOSTTY_RESOURCES_DIR/shell-integration/zsh/ghostty-integration"
셸 통합은 현대 터미널에서 가장 덜 쓰이는 기능입니다. Ghostty, Kitty, WezTerm은 모두 명령어의 경계를 감지할 수 있습니다. 한 명령의 출력이 어디서 끝나고 다음 명령이 어디서 시작하는지 알 수 있다는 뜻입니다. 이를 통해 프롬프트 사이를 점프하고, 명령 하나의 출력을 클릭 한 번으로 선택하고, 오래 걸리는 명령이 끝나면 알림을 받을 수 있습니다. 셸 설정에 작은 추가가 필요하고, 보통 스크립트 하나를 source하면 됩니다. 설정 노력에 비해 생산성 향상이 과분할 정도입니다.
# Shell integration for Ghostty in .zshrc
if [[ -n "$GHOSTTY_RESOURCES_DIR" ]]; then
source "$GHOSTTY_RESOURCES_DIR/shell-integration/zsh/ghostty-integration"
fi
# For Kitty, add to .zshrc:
if [[ -n "$KITTY_INSTALLATION_DIR" ]]; then
autoload -Uz -- "$KITTY_INSTALLATION_DIR/shell-integration/zsh/kitty-integration"
kitty-integration
fi
크로스 플랫폼 현실: macOS, Linux, Windows
터미널 에뮬레이터 개발은 크로스 플랫폼 지원이 단순히 귀찮은 수준이 아니라 정말 어려운 영역 중 하나입니다. 각 OS마다 GPU API(Metal, Vulkan, OpenGL, DirectX), 폰트 렌더링 스택(CoreText, FreeType, DirectWrite), 윈도우 시스템(Cocoa, X11, Wayland, Win32), 그리고 애플리케이션이 어떻게 동작해야 하는지에 대한 사용자 기대가 모두 다릅니다.
macOS에서는 전반적으로 경험이 가장 좋습니다. Metal은 깔끔하고 현대적인 API이고, CoreText는 폰트 렌더링을 잘 처리하며, 윈도우 시스템도 일관적입니다. 주요 GPU 터미널 네 가지 모두 여기서 잘 동작합니다.
Linux는 더 파편화되어 있습니다. X11과 Wayland의 분열이 가장 큰 문제인데, 둘 다 지원하는 터미널도 있고 아닌 것도 있습니다. GPU 드라이버 품질도 NVIDIA 독점 드라이버, AMD의 Mesa 스택, Intel 내장 그래픽에 따라 제각각입니다. 타일링 윈도우 매니저 사용자는 GNOME이나 KDE 사용자와 다른 동작을 원하기도 합니다. 동작은 하지만, 약간의 손질이 필요할 수 있습니다.
Windows는 많이 발전했습니다. Windows Terminal은 기본 제공되는 훌륭한 GPU 가속 옵션입니다. WSL2와 WSLg 덕분에 Windows에서도 Linux 네이티브 터미널을 합리적인 성능으로 돌릴 수 있습니다. Alacritty와 WezTerm은 Windows를 1급으로 지원합니다. Ghostty는 Windows 생태계에는 비교적 새로 들어왔지만 지원 범위를 넓혀 가고 있습니다.
터미널 기술의 다음 방향
GPU 렌더링은 이제 기본 조건입니다. 다음 전선은 터미널이 이미 가지고 있는 의미 정보를 어떻게 활용하느냐입니다. GPU 터미널은 단순히 픽셀을 밀어 넣는 게 아니라, 화면의 구조화된 모델을 유지합니다. 어느 셀에 어떤 문자가 있는지, 어떤 색과 속성이 설정되어 있는지, 명령어의 경계가 어디인지 알고 있습니다. 그 모델은 더 똑똑한 기능의 토대가 됩니다.
AI 도구 통합은 분명한 방향입니다. 터미널은 이미 AI 코딩 어시스턴트의 주요 인터페이스이고, 대화형 diff, 인라인 승인 워크플로, 단순히 그려진 텍스트가 아닌 구조화된 데이터처럼 더 풍부한 출력을 지원해야 한다는 압박이 있습니다. 터미널은 빠름을 가능하게 한 텍스트 중심 모델을 버리지 않으면서, 조용히 문자 격자에서 풍부한 문서 렌더러에 가까운 무언가로 진화하고 있습니다.
접근성은 뒤늦게 주목받고 있습니다. GPU 터미널은 의미 기반 화면 모델을 플랫폼 접근성 API에 노출할 수 있는데, 이는 원시 픽셀만 노출하는 레거시 터미널보다 잠재적으로 낫습니다. 여러 프로젝트가 2026년에 이를 우선순위로 삼았고, 결과는 고무적입니다.
WASM 기반 터미널 확장에 대한 관심도 커지고 있습니다. 표준화된 플러그인 모델로, 커뮤니티가 만든 기능(커스텀 렌더러, 프로토콜 핸들러, 입력 프로세서)을 여러 터미널에서 안전하게 실행할 수 있게 합니다. 아직 초기 단계지만, 브라우저 확장처럼 커맨드 라인을 위한 터미널 확장 생태계라는 아이디어는 분명한 매력이 있습니다.
VT100이 나온 지 거의 50년이 지났습니다. 그가 확립한 핵심 추상화, 즉 이스케이프 시퀀스로 조작되는 문자 격자는 놀랄 만큼 오래 살아남았습니다. 바뀐 것은 추상화가 아니라 구현입니다. GPU 렌더링, 현대적 프로토콜, 네이티브 플랫폼 통합이 그것입니다. 터미널은 다시 발명될 필요가 없었습니다. 다시 엔지니어링되어야 했을 뿐이고, 그 작업은 이제 본격적으로 진행 중입니다.


