Kitty 圖形協議完整實作與效能優化

Ghostty 1.4.0 完成了 Kitty 圖形協議中最後兩項主要功能:動畫(Animation)與相對定位(Relative Placements)。這使得 Ghostty 成為除 Kitty 本身之外,首款完全符合該公開規範的終端機模擬器。支援此功能的程式(如使用 kitten icat 顯示 GIF)現在可在 Ghostty 內播放動畫,而非僅顯示靜止幀;同時支援圖片間的相對位置關係,讓子圖片能隨父圖片移動。

開發團隊對 Kitty 圖形實作進行了完整的規範一致性檢查,修正了數十種行為差異,例如確保圖片在滾動區域內隨文字滾動、重複傳輸相同 ID 的圖片會替換舊圖片,以及無效圖片資料現在會返回錯誤回應而非靜默失敗。

在效能方面,圖片負載現採用 SIMD 技術進行批次解析,取代原先逐位元組處理的方式。根據基準測試(x86_64 Linux, 64 MiB 圖片資料),大型圖片傳輸的解析速度提升約 16 倍,且每幀繪製圖片的成本大幅降低。

滾動歷史記錄壓縮與記憶體使用量降低

Ghostty 現在會透明壓縮不可見的滾動歷史記錄(Scrollback),僅在終端閒置時執行壓縮,並在用戶捲動或搜尋時按需解壓。此機制使典型文字密集歷史的實體記憶體(Resident Memory)使用量減少 70% 至 90%,且對 I/O 吞吐量無可測量的影響。

得益於壓縮技術,每個終端的預設滾動限制從 10 MB 提升至 50 MB。在支援壓縮的平台(macOS 與 64-bit Linux)上,即使達到新的 50 MB 限制,其實際佔用的實體記憶體通常仍低於舊版 10 MB 未壓縮時的用量。

除了滾動記錄,其他記憶體使用也顯著降低:新建的空終端在 macOS 上的頁面記憶體佔用從 128 KiB 降至約 16 KiB;隱藏的標籤頁會釋放 GPU 資源(例如 20 個隱藏標籤的 GPU 記憶體從約 385 MiB 降至 18 MiB),且重新顯示時重建時間少於 1 毫秒。

需注意,壓縮僅降低實體記憶體佔用,而非虛擬記憶體,因此在測量時應關注 Resident Memory。此功能目前僅支援 macOS 與 64-bit Linux。

macOS I/O 吞吐量提升與 VT 處理加速

在 macOS 上,開發團隊發現核心層對 PTY(偽終端)的每次讀取限制約為 1 KiB,無論讀取緩衝區大小如何。舊版 Ghostty 在收到每個讀取請求時立即處理,導致每千位元組都要支付額外開銷,且寫入程式會被阻塞。

新版 Ghostty 改為在一個執行緒上排空 PTY,並在另一個執行緒上解析先前讀取的輸出。此架構調整使 macOS(M4 Max, 純文字與 Unicode)上的端到端 I/O 吞吐量較 Ghostty 1.3.x 提升 25% 至 55%。

VT 處理本身也大幅加速:在解析器基準測試中,純 ASCII 文字處理速度從 128 MB/s 提升至 725 MB/s(約 5.7 倍),CJK 文字速度提升 3.4 倍。處理一個來自 asciinema 的 2.6 GB 真實世界終端記錄資料集的速度提升約 25%。

綜合這些改進,在 macOS 上使用 cat 指令讀取 150 MB 文字檔案的時間從 1.5 秒縮短至 566 毫秒。此外,調整視窗大小(Resize)在大滾動記錄下速度提升約 6 倍,複製與搜尋功能的速度提升 1.5 至 8 倍。

SSH 整合改進與新 CLI 指令

Ghostty 1.4.0 引入了 ghostty +ssh 指令,作為 ssh 的即插即用包裝器。該指令會在連線前自動在遠端主機安裝 Ghostty 的 terminfo,並轉發 COLORTERM、TERM_PROGRAM 等環境變數,確保遠端會話能正確識別 Ghostty 終端特性。

若遠端主機缺乏 tic 工具導致 terminfo 安裝失敗,系統會自動回退至 TERM=xterm-256color。開發者可透過 --terminfo=false、--forward-env=false 等參數控制各步驟行為。此功能取代了先前分散在各 Shell 整合腳本中的邏輯,使 bash、zsh、fish 等 Shell 的行為一致化。

Terminfo 安裝機制更加可靠:Ghostty 現在總是安裝其內建的 terminfo,而非接受遠端現有的 xterm-ghostty 條目,並在 Ghostty 更新時自動重新安裝。安裝快取按主機與端口分離,避免共用 IP 的機器共享快取條目。

安全性修復與設定變更

本次發布包含多項安全修復(GHSA 編號),涵蓋貼上保護、惡意 Kitty 圖形指令導致的崩潰或檔案讀寫越界、tmux 控制模式下的崩潰問題,以及 macOS 上 Cmd-click 超連結可能執行不安全本地檔案或自訂 URL Scheme 的問題。

部分設定行為發生破壞性變更(Breaking Changes):copy-on-select 選項重構為 none、primary、clipboard、both 四種值;在 macOS 上預設值改為 none,選取文字不再自動複製到任何剪貼簿。若需恢復舊版行為,需手動設定 copy-on-select = primary。

GTK 版本要求升級至 GTK 4.18 與 libadwaita 1.7,這意味著 Ubuntu 24.04 LTS 預設環境不再符合最低系統需求。用戶可使用 Flatpak 套件或較舊版本的 Ghostty 作為替代方案。

Linux/FreeBSD 新 OpenGL 渲染器與文字清晰度

GTK 應用程式引入了新的渲染管線,不再使用 GtkGLArea,而是透過 EGL 在獨立執行緒上繪製,並將每幀輸出為 DMABUF 交給 GTK 顯示。此改變實現了三重緩衝(Triple-buffering),應能大幅減少畫面撕裂現象,並確保 OpenGL 呼叫不在主執行緒執行。

最顯著的改進是在小數縮放比例(如 125%、150%)下的文字清晰度。Ghostty 現在以視窗的真实小數縮放比例進行渲染,確保每個渲染像素對應螢幕上的一個物理像素,解決了先前因上游 GTK 變更而復發的文字模糊問題。

若 GPU 驅動程式無法匯出 DMABUF,Ghostty 會回退至透過 CPU 複製幀的方式,雖然速度較慢但可正常運作。此功能需要系統提供可用的 EGL 函式庫。