拟物化桌面是渲染难题,不是玩笑
拟物化 Wayland 桌面 DEsk 对 GPU 渲染管线的消耗远超扁平界面。光线追踪一个桌面,到底要付出什么代价?

这个说法会让两派都不爽:拟物化之所以消亡,并不是因为用户讨厌它,而是因为它太贵了,贵在像素、GPU 周期和设计师的工时上。扁平化设计赢在经济账,而不是审美。最近流行的新项目 DEsk 是一个完整的 Linux 拟物化 Wayland 桌面,窗口是光线追踪胡桃木书桌上的纸张,它是这个论点多年来第一次真正的检验。它把道理讲得非常漂亮:只要你决定整个房间由一盏台灯照亮,你就签下了一套更接近游戏引擎、而不是 GNOME Shell 的渲染架构。
拟物化桌面实际需要渲染什么
扁平化设计对渲染器很友好。像 Mutter 或 KWin 这样的现代合成器,大部分时间都在做纹理合成:应用把缓冲区交给你,你画四边形,偶尔加个圆角着色器和投影,就完事了。在近十年内生产的任何 GPU 上,整帧几乎是免费的,这正是扁平 UI 胜出的原因。它成本几乎为零,而且只需一次简单变换就能适配任意分辨率。
拟物化则打破了这份约定。一旦你的设计语言说“这个窗口是一张带纤维、有厚度、角上卷了边的米色纸”,你就需要:
- 材质着色——纸张不是一种颜色,而是带纤维纹理、近似次表面散射的漫反射响应。这是逐像素的计算,而不是一次填充矩形。
- 统一的光照——场景中每个物体都必须对光源位置达成一致。一盏台灯意味着一张阴影贴图(或一次光线查询),所有元素都要参与其中,包括实时的窗口内容。
- 接触阴影——“平放在桌上”的窗口需要在纸张与胡桃木相接处加入环境光遮蔽,否则错觉会瞬间崩塌。
- 形变——DEsk 允许你掀起纸张一角看背面,关闭窗口时还会把它揉成一团。这是对实时纹理做顶点位移,而不是简单的缩放动画。
这些单独看都不难,游戏引擎已经做了几十年。但桌面合成器有游戏所没有的约束:那些“纸张”上的内容是任意应用的输出,最高以 60fps 刷新,而你没法预先计算任何东西。你要做的,相当于给一段实时视频流加上纸上墨迹的着色。
合成器变成了游戏引擎
DEsk 自己的架构文档讲得很直白:房间(书桌、书架、控制台、邮箱)通过 GLES 3 在 GPU 上做光线追踪,并以 CPU 追踪器作为后备,结果按屏幕尺寸缓存。这一句话就包含了整个工程策略,值得展开讲讲,因为它几乎是唯一靠谱的做法。
关键在于静态与动态的拆分。每一帧都追踪整个房间是荒谬的,即使是一个简单的路径追踪器,在中端硬件上也需要数秒一帧。但房间是静态的:书桌不动,台灯也不动。所以你在登录时追踪一次(“首次登录会绘制一次房间:有 GPU 时要几秒,没有则更久”),缓存辐射度,之后房间就只是一张纹理化的背景。动态对象,比如纸质窗口、抽屉和邮箱里的信件,则在上面做前向渲染,并按照缓存场景的光照进行匹配。
// Sketch of the two-layer architecture a skeuomorphic shell converges on
struct frame {
// Layer 1: the room. Traced once at login, cached per output size.
texture room_cache; // desk, shelf, post box, baked lamp light
// Layer 2: dynamic objects, forward-rendered each frame.
vector<object> paper_windows; // app buffers mapped onto paper quads
vector<object> drawer_items;
vector<object> notifications;
};
void render(frame *f) {
blit(f->room_cache); // one textured quad, nearly free
for (auto &o : f->paper_windows)
draw_paper(o); // fibre shader + fake AO + dog-ear
composite(f->drawer_items, f->notifications);
}
这并非巧合,它和 1993 年的 Myst 工作方式完全一样:预渲染的静态场景,上面叠加动态精灵。有观察者提到 DEsk 带有“浓浓的 Myst 味道”,他们说得比自己意识到的还要对。这不只是审美上的亲缘,而是同一套渲染架构,因为同样的约束(昂贵的全局光照、廉价的合成)至今依然成立。作为一个历史爱好者,我很喜欢这一点。三十年的 GPU 进步之后,“我该如何对桌面做光线追踪?”的诚实答案依然是:“别做,追踪一次,然后撒个谎。”
多显示器设计体现的也是同样的务实。与其为每块屏幕追踪一个更大的房间,额外的显示器只是显示“书桌木板的延续”,静态背景向外延伸,缓存的场景在各个输出之间摊销。会话中途拔掉的屏幕,其窗口只需重新挂到剩下的屏幕上。方法简单,但它绕开了一个真正困难的问题:每次热插拔都要重新追踪。
拟物化在 GPU 上的开销是扁平 UI 从不会有的
我们具体算一算这笔开销。大多数讨论里“更重”这个说法都没有什么实质内容,值得拆开看。下面对比一个扁平合成器处理一个窗口,与 DEsk 的纸张隐喻需要做的事情:
扁平:把客户端的 wl_buffer 绑定为纹理,画一个用于采样它的四边形着色器,可能用符号距离函数做圆角,再加一个廉价的 9 次采样投影。每个窗口的成本是每个像素几次纹理读取,且都来自缓存友好的区域。
纸张:客户端缓冲区只是“墨迹”。你还需要一层纸张底层(纤维纹理、边缘变暗、厚度的边缘线),一个卷边的角落,它是独立的折叠几何体,有自己的光照;一层与书桌相接的接触阴影,它取决于窗口在场景中的位置;以及与烘焙在房间缓存中的台灯光照保持一致的光照。而当用户拖动边缘“拉出更多纸张”时,纸张四边形会独立于内容调整大小。你把窗口几何与表面几何解耦了,这是任何普通合成器都不会做的事。

但真正的代价不在吞吐量,现代 GPU 对于多出的几层纹理根本不当回事。代价在于管线复杂度。扁平合成器在整个会话中的着色器预算只需一两个程序。而拟物化外壳需要一套小型材质系统:纸张、胡桃木、黄铜、玻璃(时钟的灯罩镜片)、织物。每种材质都是一个着色器变体,每个变体都可能在某些驱动上出问题,而且每个变体都要与共享的台灯光照相互作用,因此无法孤立地编写。这就是 Enlightenment 和 GTK2 时代经典主题化风潮消亡的原因,也是实践者提出的最有力的反驳:窗口管理器其实是简单的部分。每个应用仍然要用 GTK 或 Qt 绘制自己的内容,合成器端再多的胡桃木也无法让一个 libadwaita 应用看起来像是放在实体书桌上。DEsk 只部分解决了这个问题:使用客户端装饰的窗口也会“放在纸上”,这意味着这个隐喻是包裹应用,而不是改造应用。
Wayland 让这件事既更容易,也更困难
这类项目现在出现而不是在 2010 年出现,是有原因的。Wayland 的核心架构赌注是:合成器拥有整个帧,每个像素都要经过它,而这正是拟物化外壳需要做出的赌注。在 X11 之下,应用想往哪画就往哪画,你能做的最好的事,就是一个合成管理器拼命地重新挂载窗口并祈祷。在 Wayland 之下,外壳会收到干净、隔离的表面缓冲区,并可以完全自由地决定如何呈现它们。如果你想把一个表面映射到一张可形变、带卷角的纸上,Wayland 是第一个让这件事只是“难”而不是“说不通”的显示系统。
但 Wayland 也抬高了门槛。桌面环境不只是一个渲染器,还包括二十年来协议不断累积的产物:为旧应用准备的 Xwayland、为输入法准备的 IBus 桥接(DEsk 支持在书架索引和备忘录上打字)、音量旋钮用的 PipeWire、亮度与合盖处理用的 logind、时钟媒体页面用的 MPRIS、锁屏用的 PAM。每一项都是一个集成界面,而像 GNOME 这样的项目会由数百名贡献者分摊这些工作。DEsk 划出了一条明确的界线,即“自己做什么、借用什么”,把网络、蓝牙、打印以及其他应用的主题化交给现有的自由软件。这种借用策略是小团队能交付完整桌面的唯一方式,但也意味着拟物化的幻觉会在边缘戛然而止:Wi-Fi 设置是别人的扁平 GTK 面板。
对于想要尝试的人,还有一点值得注意:由于房间按屏幕尺寸缓存,而动态层是纯 GLES 3 前向渲染,稳态开销应该并不惊人,与任何做重度特效的合成器相当。真正的痛点在于没有 GPU 的机器上登录时的追踪(有 CPU 后备,但很慢),以及 v0.1 测试版的整体粗糙感。评测者反映,控制面板电源键这类有状态控件的动画不稳定。在拟物化界面中,这已经不是外观上的小毛病:当钥匙旋转的动画出错时,你无法判断机器是否真的会关机。拟物化提高了动画正确性的门槛,因为动画本身就是状态指示器。扁平设计那份未被珍视的优点是:开关只有两种可绘制的状态,中间没有过渡。
我们为什么不再这样构建
标准的历史叙述说,拟物化只是一根拐杖,用逼真的隐喻来教人们使用触摸屏,等用户“长大”之后,我们就扔掉了皮革缝线。这个故事大体是错的,而 DEsk 之所以有价值,恰恰在于它暴露了真正的经济账。拟物化的消亡,发生在两件事同时出现的时候:Retina 屏幕让手绘纹理需要覆盖的像素数翻了四倍,而移动设备让 UI 运行在受限的 GPU 上,还要靠电池供电。扁平矢量 UI 天然可以无成本缩放,而拉丝金属纹理在 1x、2x、3x 下则不行。Apple 的 iOS 7 重新设计并不是品味的演进,而是渲染预算被大幅削减。如果你读过GPU 加速终端如何从 TTY 字符网格发展到完整的着色器管线,你就会从另一个方向看到同样的取舍:我们在应用内容内部可以肆意使用 GPU,但界面外壳本身却开始节食了。
还有一个与 GPU 无关的更深层原因:一致性是无法组合的。一个设计师可以做出一个精美的实体隐喻,但一千个第三方开发者做不到。书架隐喻对 DEsk 自家的应用很有效。一旦 Firefox 把它自己扁平的灰色 UI 渲染到纸上,你看到的就是一张贴在道具上的截图。Hacker News 的讨论从两个方向精准点破了这一点:一位评论者怀念 GTK2 可主题化的时代,另一位则指出现代工具包“似乎有意抗拒主题”。桌面可以是一张书桌,但应用永远不会是。隐喻会泄漏,而每个做过主题化环境的人都知道,这种泄漏对幻觉是致命的。这与让UX 反模式如此顽固的鸿沟是同一个:表面很容易修,生态却不容易。
反直觉观点在哪里站不住脚
我说拟物化输在经济账上,我依然这样认为。但诚实起见,必须做出让步,而 DEsk 自身的粗糙之处恰好提供了这些让步的依据。
首先,有些成本根本不是渲染问题,而是交互的歧义。实体隐喻借用了用户对现实世界的预期,而物理世界没有撤销键。当关闭窗口变成“揉成一团扔掉”时,第一次很迷人,但你第四十次下意识关错窗口时就会有点惊悚。扁平化界面的抽象性是一项特性:一个小小的 × 是一个承诺,而不是一场表演。其次是状态性。实体物件必须始终看起来就是它本身;卡住的钥匙旋转动画不只是一个卡顿的过渡,它是在对你的机器是否会关机撒谎。拟物化 UI 必须在一些扁平 UI 可以允许近似的地方保持正确,而动画的正确性在测试工时上代价极高。任何做过UI 必须忠实反映分布式状态的系统的人,都深有体会。
扁平设计那份未被珍视的优点是:开关只有两种可绘制的状态,中间没有过渡。而黄铜钥匙有无穷多种状态,其中每一种都可能成为一个 bug 报告。
第三,可访问性与可发现性是双刃剑。多位评论者指出,实体桌面隐喻确实可能帮助那些从未建立文件系统心智模型的老年用户。他们靠死记硬背学会点哪里,一旦界面改变就无法恢复,因为扁平 UI “对他们没有内在逻辑”。桌面则有逻辑:信件放进邮箱,文档就是纸,要保留的东西放进抽屉。这是一个真实的论点,把它当作怀旧而打发掉是懒惰的。但同样的实体性也会对另一类用户隐藏功能:你怎么发现 Super+D 能打开抽屉,或者一个折叠的窗口可以放进去?实体的可供性在物件触手可及时才有效,而键盘快捷键无论如何都是纯粹的习得性抽象。

DEsk 真正的意义
如果把 DEsk 理解为一个提议,说我们都该转去用光线追踪的书桌办公,那就错了。这不会发生,而我开头提到的经济账依然成立:一家要向十亿台设备发货的平台厂商,负担不起在铬合金上做逐像素材质着色器、手工调校的台灯光照,以及动画正确的黄铜钥匙。扁平设计仍然是系统软件的正确默认选项,就像混凝土是桥梁的正确默认材料一样。
DEsk 真正证明的,是 Linux 桌面需要十年才能被证明的一件事:合成器层现在已经足够有表现力,可以成为一种媒介。Wayland 加上现代 GPU,给了一个有执念的开发者一块全帧画布,其余量足以渲染出一个连贯的世界,而不只是排列矩形。Myst 时代的技巧(烘焙昂贵的光照,前向渲染动态层)弥合了曾经让这件事无法实现的性能鸿沟。无论有人构建的是怀旧的胡桃木书桌、某位评论者幻想过的 Nostromo 飞行甲板,还是谁都没想到过的东西,这都是品味的问题。真正的新闻是这种能力本身。
计算领域里有一个反复出现的模式:技术逐渐成熟,主流收敛到最便宜且足够用的审美,然后爱好者们又把昂贵的审美重新发掘出来,当作一种手艺。机械键盘、单比特抖动艺术、模拟器里的 CRT 着色器,都是这样来的。拟物化桌面是这个队列中的下一位。它们不会取代任何东西。它们只会提醒我们,就像 DEsk 那盏台灯照亮整个光线追踪房间一样,扁平的灰色矩形从一开始就是一项预算决定,而预算与品味不同,是可以争辩的。


