终端仿真器可以像 TTY 1-6 一样快吗?

终端仿真器可以像 TTY 1-6 一样快吗?

我最近一直在尝试各种终端模拟器,从内置的 gnome-terminal、aterm、xterm、wterm 到 rxvt。我一直在做的测试是按以下顺序进行的:

  1. 打开一个有 2 个窗格的 tmux 窗口
  2. 左窗格将是一个详细的密集型任务,例如grep a /et/c -r或一个简单的任务time seq -f 'blah blah %g' 100000
  3. 右侧窗格将是一个打开语法的 vim 窗口,可以打开任何代码超过 100 行的文件。

当左窗格打印大量输出时,右窗格似乎非常慢且无响应,我尝试在 vim 中滚动,但需要 1-2 秒才能更改。当我尝试按下CtrlC左侧窗格时,它等待了 10 秒以上才停止

当我在 TTY 中执行相同的操作(按CTRL+ ALT+( F[1-6]))时,它不会发生,并且两个窗格都非常敏感。

我已经关闭了一些配置,例如抗锯齿字体、关闭着色、使用默认设置以及更改为 xmonad 和 openbox,但它没有改变任何内容。

这些终端之间的结果time seq -f 'blah blah %g' 100000并没有真正的不同,但响应能力确实不同,特别是当我运行 spitted pane tmux (或其他多路复用器)时。仅供参考,我正在以最大化模式运行所有这些。

我读过有关帧缓冲终端的信息,但不确定它是如何工作的以及如何使用它来加速我的终端模拟器。

所以我的问题是,是什么让终端模拟器比 TTY 慢得多?有没有可能让它像 TTY 一​​样快?也许硬件加速之类的?我知道一件事,当运行最大化的终端模拟器时,我在 X 服务器中的分辨率是 1920x1080,而当我运行 TTY 时,它的分辨率小于该分辨率,但我不确定这将如何影响性能。

答案1

当 GUI 终端仿真器打印出字符串时,它必须将字符串转换为字体代码点,将代码点发送到字体渲染器,获取位图并位块传输该位图通过 X 服务器显示。

字体渲染器必须检索字形并运行它们(您知道 Truetype/Opentype 字体是程式在字体渲染器中的虚拟机内运行?)。在运行每个字形的过程中,会在字体规格、字距调整(尽管等宽字体和字距调整不能很好地混合)、Unicode 合规性方面做出大量决策,而这甚至是在我们到达可能使用 sub 的光栅化器之前。 - 像素寻址。然后,终端必须获取字体光栅化器生成的缓冲区,并将其位块传输到正确的位置,处理像素格式转换、Alpha 通道(用于子像素寻址)、滚动(这涉及到更多的blitting)等。

相比之下,将字符串写入以文本模式运行的虚拟终端(注意:不是图形控制台)涉及将该字符串写入视频内存。 '你好世界!'涉及写入 13 个字节(如果您也需要颜色,则为 13 个 16 位字)。 X 字体光栅化器甚至还没有开始伸展练习和指关节断裂,我们就完成了。这就是为什么文本模式在过去几十年中如此重要。它是非常快速实施。甚至滚动也比您想象的更容易:即使在古老的基于摩托罗拉 6845 的 MDA 和 CGA 上,您也可以通过向寄存器写入单个 8 位值(可能是 16 位……太长了)来垂直滚动屏幕。屏幕刷新电路剩下的都做了。您实际上是在更改帧缓冲区的起始地址。

您无法使图形终端像文本模式终端一样快相同的电脑。但请放心:有些计算机的文本模式比您在现代计算机上可能看到的最慢的图形终端还要慢。最初的 IBM PC 相当糟糕(DOS 具有软件滚动功能,唉)。当我在 80286 上看到我的第一个 Minix 控制台时,我对(跳跃)滚动的速度感到惊讶。进步是好的。

更新:如何加速终端

@普伊热已经提到了三个他的回答,但这是我自己对它们的看法:

  • 减小终端的尺寸。我自己的终端往往会增长,直到填满屏幕,并且当它们这样做时它们会变慢。我对图形终端感到愤怒和恼火,然后我调整它们的大小,一切都变得更好了。 :)
  • (@poige) 使用不同的终端模拟器。您可以以牺牲一些现代功能为代价来获得巨大的速度提升。xterm并且rxvt工作得非常好,它有一个很棒的终端模拟器。我怀疑你的测试可能表明它们的性能比“现代”的更好。
  • (@poige) 不要使用可缩放字体。1986 可能会打电话要求归还其终端,但你不能否认它们的速度更快。 ;)
  • (@poige) 简化字体光栅化器通过关闭抗锯齿/子像素寻址和提示。它们中的大多数允许覆盖环境变量,因此您不必在全局范围内执行此操作。注意:如果您选择位图字体,则毫无意义。
  • 这会造成最大的伤害:不要使用(多个窗格)tmux— 并排运行两个独立的终端。当tmux显示两个窗格时,它必须使用终端指令来大量移动光标。尽管现代终端库非常它们速度快且善于优化,但仍然从您的原始终端带宽中窃取字节。要将光标移动到 DEC VT 兼容终端上的任意行,请发送ESC [ row ; col H.即 6-10 个字节。通过多个终端,您可以分离工作,消除定位、优化、缓冲和所有其他工作的需要curses,并更好地利用多个 CPU 内核。

答案2

同时@Alexios已经很好地描述了所有原因,我可以提到几件事,这相对减轻了痛苦:

  • 使用位图字体(TerminalTerminus——这真的很棒),
  • 关闭抗锯齿功能,或者至少考虑不使用子像素渲染,
  • 使用 KDE 的终端 — konsole.

答案3

一个违反直觉的技巧可能会给你比其他图形终端模拟器更快的速度(尽管我想象任何比使用位图字体而不是 open/freetype 的简单终端 emu 更快的东西听起来像是更简单的终端中代码的错误),但有您考虑过 OpenGL 终端模拟器,例如 Kitty 或 Alacritty?

他们确实宣传速度是使用它们相对于其他终端模拟器的主要好处之一。

我不希望你达到纯文本模式 Linux 控制台的速度,因为将两个字节(一个用于字符,第二个用于前景色和背景色)放入正确的内存地址实在是太快了,但是当涉及到 GUI 终端仿真器时,它可能是最快的选择。

相关内容