(4 封私信 / 13 条消息) 在 macOS 中关闭应用窗口,为什么默认设定不是完全退出? - 知乎
这个问题表面上只是个系统使用习惯的小细节,但它背后其实蕴含了现代 GUI 设计中「窗口」和「文档」概念的演化。这里展开科普一下。
长文预警,共有三部分:
- 从窗口到文档:经典 Macintosh 的设计取舍
- 从 MDI 到 SDI:Windows 的技术革新
- MDI、SDI 与 TDI 的共存:多样的 GUI 世界
从窗口到文档:经典 Macintosh 的设计取舍
在现代桌面 OS 的 GUI 中,实际上存在着三层面向用户的概念:应用、窗口和文档。每个应用可以打开一或多个窗口,每个窗口可以打开一或多份文档。这听起来十分自然,就像输入 baidu.com 就能打开百度一样简单。
但要知道在算力极为紧缺的上古时代,这套抽象的建立并不容易。例如桌面 GUI 必然要允许多个窗口之间的共存与切换,而这就带来了一个难题:打开 N 个窗口时,应用就需要在技术上被加载 N 次吗?
从技术实现角度说,1984 年 Macintosh 的 128KB 内存(注意不是 MB 也不是 GB)几乎不可能允许将每个窗口建模为单个进程并分配独立的内存,更不要说引入能自动调度前后台进程的抢占式多任务机制了。换句话说,就是它的算力始终只够跑一个前台程序,并且还无法由系统自动切换。除此以外,启动和关闭应用的开销也是昂贵的。
这些技术限制,使得此时的 GUI 设计需要将两点准则传达到用户感知上:
- 应用在逻辑上只会开一份,并且只有位于前台的应用才可交互。
- 用户应该尽量「停在这个应用里」,规避冗余的切换和重新打开。
为此,乔帮主手下的 Bill Atkinson 设计出了经典的全局菜单栏。比如下图中 MacPaint 在前台时,这整条菜单栏就是给 MacPaint 用的,传达出强烈的「现在是我在台上」的感觉:
更重要的是,苹果还更进一步地在产品角度定义出了文档的概念[1]:一个应用是用来处理文档(而不是打开窗口)的——既然如此,在暂时关掉一份文档窗口的时候,应用当然不应该完全退出了。
我们可以这样理解此时「应用、窗口、文档」的三层抽象:
换句话说,所谓的「关闭窗口」只是关闭了应用所打开的一份文档,而不是关闭了整个应用。这也就是 macOS 上 ⌘ W(关闭 Window)和 ⌘ Q (Quit 应用)背后的基础性设计隐喻了。
个人认为,这套交互虽然很大程度上有弥补当年多任务能力缺陷的背景,但仍然是非常简洁而自洽的。当然它有时也可能令人困惑,比如在上面 MacPaint 的例子中,如果我们关闭了这两个窗口,会发现这时虽然看起来回到了桌面,但实际上并没有(相当于 MacPaint 的进程还停留在前台,你看到的桌面只是假象):
此外,还有一个地方也能印证经典 Macintosh 中「窗口归属于应用」的特性,那就是它不允许不同应用之间窗口层级的交错[2]。比如在下图中如果点击 A,会发现窗口 B 也一起浮上来了。这是因为它们都是属于 MacPaint 应用的窗口,需要被一起切到前台(前端同学不妨想想这个设定对性能优化有什么帮助):
经典 Macintosh 可以在网页上在线体验jamesfriend.com.au/pce-js
到这里,我们就应该已经很清楚「macOS 中关闭应用窗口,为什么不会完全退出」的历史原因了:在硬件条件限制下,苹果引入了文档概念,将单个应用对应到了零或多份文档(而不是单个窗口)上,这样关闭文档窗口就不会令应用完全退出了。
但更有趣的问题在于,为什么 Macintosh 的这套交互能沿用近四十年至今呢?它是否就属于应该被后来者 Windows 淘汰的设计呢?在做对比之前,还值得了解一些来自 Windows 这边的进展。
从 MDI 到 SDI:Windows 的技术革新
上面我们提到了 macOS 中「窗口归属于应用」的说法。这表明应用实例没有被绑定到单个窗口上,多份文档是直接存在于同一个应用名下的。这在 GUI 领域被称为 Multiple Document Interface(MDI)。
和使用 80 年代技术的旧版 Mac OS 相比之下,90 年代的后来者 Windows 具备了一项代差级别的技术优势,那就是基于 NT 内核的抢占式多任务支持。这使得每个窗口都可以加载为独立的应用实例,并由 OS 自动调度,也就是所谓的「真后台」。这时候要打开 N 份文档,直接启动逻辑上的多份应用就行了。这就是所谓的 Single Document Interface(SDI)式 GUI 了。
SDI 让「应用、窗口、文档」三者之间的关系变成了这样:
朴素的 SDI 是非常简单粗暴的:一个窗口里既是一份应用,又是一份文档——这时的交互逻辑就从以文档为核心变成了以窗口为核心,别忘了这个操作系统本身就叫做 Windows。比如下图中的任务栏上会有两个 Excel 图标,菜单也有两份,强烈向你暗示这是同个 Excel 应用开了两份:
注意从技术角度来说,这个窗口管理的行为是可以修改配置的。但这不妨碍 Windows 应用的主流风格很早前就从 MDI 转向了以 SDI 为主[3][4]。
作为对比,现在的 macOS 中虽然也有相似的行为,但背后的概念仍然是不同的。比如在 Dock 应用图标上右键时,可以发现它仍然会明确地告诉你这是同个应用下的多个窗口,而不是同个应用打开了多份:
现在,macOS 和 Windows 的这种差别已经相当细微,几乎可以忽略不计。但在当年,Windows SDI 背后的「真后台」能力使其体验大幅优于老 Mac OS,也是历史上 Windows PC 阵营能赢得与 Mac 之争的重要因素。
显然,Windows 对现代桌面 GUI 的贡献是无可否认的。但是,这就说明 Windows 的 SDI 优于 macOS 的 MDI 吗?
MDI、SDI 与 TDI 的共存:多样的 GUI 世界
SDI 使得应用、窗口与文档之间能形成「一个一个一个」的关系,从而获得简单的「关掉窗口直接退出应用」行为。再到后来的移动端时代,常规 iOS 应用中甚至都可以认为不需要文档的概念,一个应用就是一个窗口。但问题在于,桌面 OS 作为生产力工具,这样的抽象够用吗?
如果基于朴素的 SDI,打开 10 个浏览器页面(文档)就会带来 10 个窗口。再比如对于开发者而言,同时打开几个项目中十几个不同的代码文件(文档)的需求也非常常见。这时如果直接在几十个独立的窗口之间切换,效率显然是很低的。这种工作场景下的窗口分组管理需求,自然地催生出了基于标签的 Tab Document Interface(TDI)式 GUI。
在 TDI 中,每个窗口中可以有多个 Tab,每个 Tab 对应一份文档。比如 Chrome 和各类现代 IDE 都支持打开多个窗口(项目),其中每个窗口(项目)里都能打开多个标签页(代码模块),从而它们都可以视为一种 MDI + TDI 的混合体。这带来了两点结果:
- 由于此时应用、窗口、文档之间形成了明确的「一对多对多」关系,这使得 Macintosh 当年分离出的三个概念还能继续很好地沿用。
- 由于这类应用一般会追求跨平台的体验一致性,因此系统层面使用 MDI 还是 SDI 的区别已经不大,也让 Windows 和 macOS 之间的边界进一步模糊了。
除此之外,还有一些需要特事特办的场景。比如 Photoshop 在 macOS 上算是一个特例[5],因为它不允许存在多个主窗口[6]。个人认为将这种 GUI 命名为 SWI(Single Window Interface)会比较恰当,因为 PS 在主窗口中也可以打开多个 PSD 文件并切换,更像是个单窗口版的 Chrome。
为什么 PS 要强制使用单个主窗口呢?这倒是不一定的。比如我司部署的稿定 PS 就在这方面整了个好活,直接在浏览器的 TDI 里再套一层 TDI:
虽然看起来多页 TDI 嵌套更酷炫一点,但这其实更多地属于一种 Web 平台上的技术限制,因为现代 OS 中,多个窗口意味着它们之间内存的隔离。譬如假设要对上面的世界名画图层做复制,那么如果不同 PSD 的 Tab 不在同一个进程(浏览器标签页)下,那就必须做一次深拷贝,占用两份位图的内存空间。从这个角度看来,原生 Photoshop 的单主窗口设计不仅更容易实现应用内的剪贴板,也更便于实现内存空间复用等底层优化(相比之下 VSCode 就没有这个必要,毕竟代码再怎么复制粘贴都是纯文本)。这也体现了各类专业工具视场景而在 GUI 呈现形式上所体现出的的特殊性。
另外在今天的 macOS 上,有些地方也已经不再是严格的 MDI 了。比如现在的 QuickTime 会在窗口失焦时自动退出,App Store 更已经改为了按一下 ⌘ W 就会退出的 SDI 形式。这些 macOS 中 SDI 化的改动和 Windows 中所存在的 MDI + TDI 成分形成了呼应,可能这就是一种双向的奔赴吧。
现在我们可以做个简单总结了:
- macOS 中关闭应用窗口的默认行为之所以与 Windows 不同,原因在于这是 Macintosh 时代背景下设计出的 MDI,而非 Windows 这样以窗口为核心的 SDI。
- 现代桌面生产力工具已经不可避免地存在 MDI 中应用、窗口和文档的多层抽象,因此 macOS 的建模并没有过时,能顺利沿用至今。
- MDI、SDI 和 TDI 等模式之间并没有绝对的孰优孰劣,它们各有适用场景,共同构成了现代的桌面 GUI 生态。
时至今日,窗口和文档的概念已经在 GUI 中约定俗成而无处不在了。但当现在的前端开发者在操作浏览器里的 window 和 document 对象时,会想起这是四十年前 GUI 先驱们所发明的隐喻吗?
最后还有一条小建议:如果你还在因不习惯 macOS 而感到困扰,最好还是多熟悉不同系统间的文化差异,做到用 Mac 时就是 Mac 用户,用 Windows 时就是 Windows 用户。这样你背后就有两个强大的操作系统了。
参考
- ^MDI Quote 1 - Wikipedia https://en.wikipedia.org/wiki/Multiple-document_interface#:~:text=MacOS%20and%20its%20GUI%20are%20document%2Dcentric%20instead%20of%20window%2Dcentric%20or%20application%2Dcentric
- ^MDI Quote 2 - Wikipedia https://en.wikipedia.org/wiki/Multiple-document_interface#:~:text=Indeed%2C%20prior%20to%20Mac%20OS%20X%2C%20it%20was%20purposely%20impossible%20to%20interleave%20windows%20from%20multiple%20applications
- ^SDI and MDI | Microsoft Docs https://docs.microsoft.com/en-us/cpp/mfc/sdi-and-mdi?view=msvc-170#:~:text=Under%20Windows%2095%20and%20later%2C%20applications%20are%20commonly%20SDI
- ^Windows 存在从早期 MDI 到 SDI 的转型,详情参见评论区讨论
- ^Windows 上的 Photoshop 仍属于 MDI,详情参见评论区讨论
- ^主窗口即所谓的 frame window 或 parent window
编辑于 2022-06-10 00:42・IP 属地福建