[开源]OxideTerm: Rust+GPUI,让终端飞起来!

52 分钟前
 soleilune

大家好,我是 OxideTerm 的作者。https://github.com/AnalyseDeCircuit/oxideterm

7 月底我在这里发过一帖,介绍了将 OxideTerm 从 WebView 迁移到 Rust + GPUI 的过程。我也希望借鉴 WindTerm 等知名 SSH 客户端和终端的一些好用设计,继续打磨这个免费开源、功能丰富( SSH ,Mosh ,Serial ,Telnet ,RDP ,VNC ,BLE 等)的原生 SSH 客户端。

原生版持续迭代了近四个月,兼容性和日常交互一直在完善,目前已经比较稳定了。从当时的 2.0.11 到前几天发布的 2.3.1 ,我们还花了不少精力打磨终端的基本功:吞吐、绘制和历史存储,希望持续追赶 WindTerm 、Ghostty 、Alacritty 等成熟终端的表现。

既然说要让终端飞起来,那就拿实际输出比划比划。

刷日志的时候,让终端速度跟上

跑构建、看大量诊断信息时,数据已经到了本机,如果终端却还在慢慢处理,眼前的内容就会落后;想滚动回看、切换会话,界面线程又忙着解析输出。我们想减少的,就是终端自己带来的这部分等待。

下面是 8 月早期发布构建与现在 2.3.1 的吞吐测试记录对比。每类负载输出 16 MiB,预热一次,测量三次取中位数,具体测试方法在仓库里。

其实这背后没有什么黑魔法,就是反复测试、找瓶颈:把 SSH 终端解析放到后台线程,批量处理文本和网格写入,减少重复扫描与内存复制,绘制时复用没有变化的文字排版。大量输出的时候,少做一点重复工作,就能给界面操作多留一些余地。

日志想多留一点?内存就要省着用!

上次去掉 WebView ,这次则深入到了历史存储。像 xterm.js 的缓冲区,内容和属性逐字符格保存,整行同色也仍然逐格保留属性。我们则把历史文本和样式分开紧凑保存,让相邻的同样式文字共享记录。

在 10 月这轮分阶段存储改造中,保留 20,000 行历史、400 列,另含 40 行屏幕,伪随机 ASCII 满行时,终端与解析器的保留堆从 196.47 MB 降到 15.50 MB ,减少 92.1%。

这是我们自己的终端内核改造前后的结果,完整记录里有具体条件。

落到日常使用,就是多留些日志、多挂几个会话时,少挤占浏览器、IDE 和容器的内存。赶上这轮内存涨价,终端能省一些,肯定是个好事情。

新增功能与改进

我们在这三四个月内也更新了很多别的功能,这里仅仅挑出来一些和大家分享:

比如下面这样,把 SSH 、本地终端、笔记和 SFTP 放进同一个标签页:

写在最后

玉不琢不成器,感谢这几个月以来热心帮助的朋友们。OxideTerm 目前依然是 GPL-3.0 的开源自由软件,免费,没有账号和订阅门槛,也不收集遥测数据。欢迎试试现在的 2.3.1 ,之前用过早期版本的朋友也欢迎回来看看。觉得顺手可以点个 Star ,有问题或建议,欢迎提 Issue 、PR ,希望它能越来越实用。最近也开了个交流群,欢迎来聊使用体验和改进建议。

感谢大家!

137 次点击
所在节点    程序员
0 条回复

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1255952

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX