Shitty 終端機模擬器:高效能 C++23 終端機

Overview

Shitty 是一個為低延遲、快速啟動和可預測資源利用率而設計的高效能終端機模擬器。它透過將終端機狀態保存在 CPU 上並利用原生計算後端進行渲染(Linux 上使用 Vulkan,macOS 上使用 Metal)來實現卓越的吞吐量。

Performance Benchmarks

在使用蘋果晶片 MacBook(Menlo 12pt,80x24 網格,500 行捲動回溯)進行的標準化測試中,Shitty 在不同資料類型上展現了領先的吞吐量:

Printable ASCII Throughput

處理 100MB 可列印 ASCII 資料時,Shitty 在比較的終端機中達到最快的牆鐘時間和吞吐量:

Terminal Wall Time User Time Throughput
Shitty 0.81s 0.50s ~118 MiB/s
Alacritty 0.17.0 0.96s 0.78s ~99 MiB/s
Kitty 0.48.2 1.28s 0.95s ~75 MiB/s
Ghostty 1.3.1 1.49s 1.60s ~64 MiB/s

Random Byte Throughput (Invalid UTF-8)

即使在解析隨機位元組(代表解析器的最壞情況)時,Shitty 仍能保持穩定和性能:

Terminal Wall Time User Time Throughput
Shitty 1.88s 1.79s ~51 MiB/s
Alacritty 0.17.0 3.07s 2.92s ~31 MiB/s
Ghostty 1.3.1 4.63s ~7.0s ~21 MiB/s
Kitty 0.48.2 N/A N/A N/A

Technical Architecture

Parser Implementation

Shitty 使用 Ragel 生成其終端機狀態機。此方法會創建一個大型確定有限自動機(DFA),對每個可能的終端機狀態都有動作,確保解析器是完整且不可破壞的。這種設計使終端機能夠將 cat /dev/urandom 作為基準測試而非導致崩潰的原因。

Rendering and Graphics

渲染是損傷驅動的,並利用原生 GPU 計算後端以確保無閃爍的調整大小和高效率:

  • macOS: 使用 Metal、CoreText、Cocoa 和 IOSurface。
  • Linux: 使用 Vulkan 和 Wayland。
  • 字形管理: 實現懶惰字形光柵化和持久的 GPU 字形快取。

Unicode and Text Handling

終端機將單元視為字形簇而非單獨的代碼點。這確保了以下內容的正確渲染:

  • Emoji 序列
  • 變體選擇器
  • 組合標記
  • 寬闊的 CJK 字符

Feature Set

Shitty 提供一套全面的終端機功能:

  • 協議: 支援 VT52 到 VT5xx 控制、xterm 擴展以及多種滑鼠協議(X10、VT200、UTF-8、SGR、SGR-pixel、urxvt)。
  • 鍵盤支援: 支援舊版、modifyOtherKeys 和 Kitty 鍵盤協議。
  • 視覺: 支援 16 色、256 色和 24 位色,包括延伸的底線樣式。
  • 安全: 預設鎖定;應用程式在未取得明確許可的情況下無法讀取選取內容或驅動主機視窗。
  • 自包含: 二進位檔案體積小且內嵌字體,使其能在未安裝字體的系統上啟動。

Build and Requirements

Shitty 是用 C++23 編寫的,並需要 Clang。在 macOS 上,需要來自 Homebrew 的 LLVM,因為系統 clang 不支援捆綁的 libstd 所需的 -std=c++26

主要依賴:

  • Python 3、Ragel 6 和 glslangValidator
  • utf8proc 2.9+
  • librsvg(用於編譯時圖示渲染)
  • Linux 特定:FreeType、HarfBuzz、Wayland 用戶端標頭、xkbcommon,以及 Vulkan 標頭/載入器。

Lineage and Licensing

Shitty 是 Zutty 的硬分叉和完全重寫,Zutty 原本由 Tom Szilagyi 創建。儘管它保留了 Zutty 的血統,但它取代了架構、渲染器和測試策略。

關於授權,專案正從 GPL 基線過渡到 MIT-only 程式碼基礎。目前,新貢獻是雙重授權於 GPLv3-or-later 和 MIT,但由於匯入的素材,合併作品仍受 GPL 約束。

Community Insights and Counterpoints

使用者和開發者的討論凸顯了幾個爭議點和興趣點:

  • 命名: 專案名稱引發了討論,有些人讚賞其幽默感,也有人認為它不專業且可能阻礙企業採用。
  • 效能情境: 有些使用者質疑極端吞吐量基準的實用性,指出標準終端機(如 Terminal.app)對於多數工作流已足夠。一位使用者聲稱 urxvt 在 X11 下的 ASCII 吞吐量仍 (~122 MiB/s)。
  • 競爭基準: Ghostty 的創建者 Mitchell Hashimoto 指出 Ghostty 的 IO 吞吐量自版本 1.3.1 以來顯著提升,並建議針對 main 分支重新進行基準測試。
  • 缺失功能: 評論家指出缺少雙向文字排列和內嵌圖形協議(如 sixel)是相較於其他現代終端機的明顯不足。

Sources