分数缩放是什么?

分数缩放是按照一个分数比例 (e.g. 1.5 倍) 对屏幕上内容的大小进行整体放大 (真的有人缩小吗?) 的操作. 在 Wayland 下主要用下面这种方式实现分数缩放

混成器将缩放比例上采样至整数倍 (e.g. 1.5 -> 2.0), 然后由混成器进行降采样. 在多屏多 DPI 的配置下, 混成器可能会将应用缩放比例设为缩放最大的显示器后将它降采样.

这种缩放方式初看可能很好, 但也引发了一个巨大的问题: 超采样产生的性能问题如何? 多渲染的像素和混成器降采样的浪费功耗总不会无端消失吧? wp-fractional-scale-v1 就因此诞生了.

分数缩放的工作情况

混成器

常用桌面环境的混成器都支持了 wp-fractional-scale-v1. GNOME/mutter 需要手工更改 dconf 键值 /org/gnome/mutter/experimental-featuresscale-monitor-framebuffer, 方能启用分数缩放支持.

应用

GTK

GTK 3

GTK 3 截至目前没有支持分数缩放的计划, 只能使用整数缩放再降采样的方法实现 分数缩放.

GTK 4

GTK 4 4.13.5 开始默认启用了新的 ngl 渲染后端, 宣称它具有更好的分数缩放.

目前, 作者已经测试了 ngl renderer 在 分数缩放下的表现. 测试的 GTK 4 版本如下:

1
2
3
paru -Q gtk4 libadwaita
gtk4 1:4.13.8.1.r96.g8d1e3778-1
libadwaita 1:1.5.beta+50+ge7d25680-1

新的 ngl 渲染器在处理分数缩放上的确有极大改进, 但还是存在以下几个问题: Modal Dialog 下的主窗口模糊, GNOME Screenshot 截图模糊以及渲染图像损坏.

![Render Corruption](Screenshot from 2024-03-01 23-10-04.webp)

Qt 5

Qt 5 截至目前没有支持分数缩放的计划, 只能使用整数缩放再降采样的方法实现 分数缩放.

Qt 6

Qt 6 实现了完整的分数缩放支持, 默认启用. 然而, QtWebEngine 会呈现出字体像素画的渲染错误 (KMail). 请使用如下环境变量禁止分数缩放:

1
QT_SCALE_FACTOR_ROUNDING_POLICY=RoundPreferFloor

Telegram

Telegram Desktop 由 Qt6 构建, 但分数缩放需要手动开启. 前往 Settings > Advanced > Experimental Settings, 启用 Enable precise High DPI scaling. 然而, 这将会导致应用内所有图标和图片像素化.

![Pixelation](Screenshot from 2024-03-03 12-06-52.webp)

Chromium

Chromium 支持 wp-fractional-scale-v1. 拓展菜单显示不全的问题似乎在 122 之后得到了解决.

Firefox

Firefox 需要前往 about:config 中启用 widget.wayland.fractional-scale.enabled. 需要注意的是, Hamburger Menu 等菜单会出现显示不全的问题, 不建议启用.

![Menu cutoff](Screenshot from 2024-03-03 12-19-12.webp)

总结

Linux 上的分数缩放进展确实在日渐完善, 且已经比混乱的 Windows 和只能整数缩放降采样的 macOS 要好上不少. 然而, XWayland HiDPI 和 Firefox 仍是两大痛点. 希望有朝一日这篇文章能得到更新.