在他的关于网页的自管绝招,丹·伯恩斯坦解释了竞争条件select()
和信号,提供一个解决办法,并得出结论认为,
当然,正确的做法是
fork()
返回文件描述符,而不是进程 ID。
他的意思是什么 - 是否能够select()
在子进程上处理其状态更改,而不必使用信号处理程序来获取这些状态更改的通知?
根据这个终端模拟器及其键码表,新版本的 XTerm 可以识别从 F1、F2、F3 到 F63 的功能键。大多数键盘只有 F1..F12 范围内的物理功能键。额外键的目的是什么?是否存在从物理键或鼠标按下到这些功能键编号的(半)标准映射,如果没有,它们是如何触发的?
我的印象是,在传统的终端用语中,所有特殊键,包括方向键、home/end 等都称为功能键(而我们这些在 PC 上长大的人只会认为 F1..F12 是功能键键)。但是,XTerm 还单独讨论了这些命名键(例如kUP
,该表中的向上箭头键)。
当终端模拟器绘制基于文本的应用程序时,为什么仍然存在视觉伪影?这适用于渲染 3D 游戏和 GUI 窗口(包括无伪影的抗锯齿矢量字体)的最新计算机。
我经常看到以下工件,它们揭示了屏幕更新过程的中间步骤:
这些伪影仅在亚秒间隔内出现,并且在大多数屏幕更新期间不会出现,但在无闪烁 GUI 上长大的我仍然想知道如何避免它们。一旦开始绘制更复杂的屏幕,上述所有工件(滚动除外)都可以在以下 ASCIInema 视频中看到:MapSCII - 控制台中的整个世界!
我也不是特别谈论更新缓慢。如果更新始终是即时的,那就太好了,但由于网络和处理延迟,这并不总是可行。我在这里的意思是,部分绘制的屏幕通常会短暂可见。在大多数现代 GUI 中,仅向用户显示完全完成的屏幕,并且部分绘图的工件非常罕见。
我的印象是终端仿真管道是这样的:
curses
或其他库将字符单元格网格转换为 ANSI 转义码,从而在终端上呈现等效屏幕上述哪一个步骤可以减慢进程速度,使终端模拟器向我们显示中间渲染步骤,而不是仅显示最终结果?
硬件终端(串行端口连接)的速度似乎是由它们的波特率决定的,波特率可以改变,tcsetattr()
但我从多个来源读到,波特率设置对终端使用的伪终端(pty)设备没有影响模拟器。这是否意味着 Unix 内核不会故意限制 pty 通信的速率?
应用程序或渲染库(curses 等)是否会在多次写入中发送文本和 ANSI 代码,而不是尝试只用一次写入write()
?
Unix 内核对其内部 I/O 缓冲区有大小限制,这会影响通过管道无阻塞发送的最大数据量等。这是否会影响渲染具有大量细节的终端屏幕(一屏文本、大量颜色等)?我想象组合的文本和 ANSI 转义码可能会产生大量数据,以至于无法放入 pty 驱动程序的缓冲区中,这会将屏幕更新分为应用程序的多个写入操作和终端仿真器的多个读取操作。如果终端仿真器急于在处理下一次读取之前显示每次读取的结果,这将导致显示闪烁,直到处理完一批中的最终读取。
终端模拟器或 pty 驱动程序是否故意设置批处理超时,以便它们的行为更接近地模仿硬件终端,感觉更自然,或者解决一些被认为比显示速度更重要的其他问题?
最近,人们做出了一些努力来制作渲染速度更快的新终端模拟器(例如,通过将字体预渲染到视频内存中的 OpenGL 纹理中)。但这些努力似乎只是在计算网格后加快了将字符单元格网格渲染到屏幕位图上的速度。 …
有没有一种相当简单的方法可以在当前的计算机上运行NeWS(网络可扩展窗口系统,一种由 Sun 公司的研究人员在 20 世纪 80 年代开发的基于 PostScript 的窗口系统)?
terminal ×2
buffer ×1
emulation ×1
fork ×1
graphics ×1
history ×1
keyboard ×1
performance ×1
postscript ×1
signals ×1
terminology ×1
umask ×1
x11 ×1
xterm ×1