Shitty Terminal Emulator: High-Performance C++23 Terminal
Overview
Shitty 是一个高性能终端模拟器,旨在实现低延迟、快速启动和可预测的资源利用率。它通过将终端状态保留在 CPU 上并利用原生计算后端进行渲染(Linux 上的 Vulkan 和 macOS 上的 Metal)来实现卓越的吞吐量。
Performance Benchmarks
在 Apple-silicon MacBook(Menlo 12pt, 80x24 grid, 500 lines of scrollback)上的标准化测试中,Shitty 在不同数据类型下均展示了领先的吞吐量:
Printable ASCII Throughput
在处理 100MB 的可打印 ASCII 数据时,Shitty 在对比的终端中实现了最快的实际运行时间(wall time)和吞吐量:
| 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
渲染是驱动于损耗(damage-driven)的,并利用原生 GPU 计算后端以确保无闪烁的调整大小和高效率:
- macOS: 使用 Metal, CoreText, Cocoa, 和 IOSurface。
- Linux: 使用 Vulkan 和 Wayland。
- Glyph Management: 实现延迟字形(glyph)光栅化和持久的 GPU 字形缓存。
Unicode and Text Handling
终端将单元格视为字形簇(grapheme clusters)而非单个码点(codepoints)。这确保了以下内容的正确渲染:
- Emoji 序列
- Variation selectors
- Combining marks
- Wide CJK 字符
Feature Set
Shitty 提供了一套全面的终端功能:
- Protocols: 支持 VT52 到 VT5xx 控制序列,xterm 扩展,以及多种鼠标协议 (X10, VT200, UTF-8, SGR, SGR-pixel, urxvt)。
- Keyboard Support: 支持 legacy,
modifyOtherKeys, 和 Kitty 键盘协议。 - Visuals: 支持 16-colour, 256-colour, 和 24-bit colour,包括扩展的下划线样式。
- Security: 默认锁定;应用程序无法在没有明确许可的情况下读取选择内容或驱动宿主窗口。
- Self-Containment: 二进制文件很小,并嵌入了字体,使其能够在没有安装字体的系统上启动。
Build and Requirements
Shitty 是用 C++23 编写的,并需要 Clang。在 macOS 上,需要使用 Homebrew 安装的 LLVM,因为系统自带的 clang 不支持 bundled libstd 所需的 -std=c++26。
Key Dependencies:
- Python 3, Ragel 6, 和
glslangValidator utf8proc2.9+librsvg(用于构建时的图标渲染)- Linux-specific: FreeType, HarfBuzz, Wayland client headers, xkbcommon, 和 Vulkan headers/loader.
Lineage and Licensing
Shitty 是 Zutty 的硬分叉(hard fork)和完全重写。虽然它保留了 Zutty 的血统,但它替换了架构、渲染器和测试策略。
关于许可,该项目正在从 GPL 基准过渡到 MIT-only 代码库。目前,新的贡献是根据 GPLv3-or-later 和 MIT 双重许可的,尽管由于引入了外部材料,组合后的工作仍受 GPL 约束。
Community Insights and Counterpoints
用户和开发者之间的讨论突出了几个争议点和兴趣点:
Naming: 项目名称引发了辩论,有人称赞其幽默感,而另一些人则认为它不专业,可能会阻碍企业级采用。
Performance Context: 一些用户质疑极端吞吐量基准测试的实际效用,指出标准终端(如 Terminal.app)对于大多数工作流来说已经足够。一位用户声称
urxvt在 X11 下的 ASCII 吞吐量仍然优于 Shitty (~122 MiB/s)。Competitive Benchmarking: Mitchell Hashimoto (Ghostty 的创建者) 指出 Ghostty 的 IO 吞吐量自 1.3.1 版本以来已显著提升,并建议针对
main分支进行重新基准测试。Missing Features: 批评者指出,与其它现代终端相比,缺乏双向文本布局和内联图形协议(如 sixel)是显著的差距。