[macOS] 对 macOS / Windows HiDPI 高分屏处理有感

看到 https://v2ex.com/t/868153 有感

macOS 的 HiDPI 对不同屏幕兼容性差,猜想是因为它的实现原理决定的。

由于 macOS 对高分屏的做法是固定 double 屏幕分辨率,渲染出逻辑尺寸只有一半的界面,但是在很多低 PPI (低于 180 )的屏幕上,这个逻辑会使得界面变得过分的大,因此 macOS 采用了“虚拟分辨率”的渲染方式:即增加显卡实际渲染的分辨率,渲染在屏幕上,起到同时“增加屏幕空间”和“利用高分屏”的目的。不止 macOS ,iOS 也用到了这种逻辑,比如 iPhone 6 Plus 的物理分辨率为 1920×1080 ,但是渲染分辨率为 2208×1242 ,逻辑分辨率是 736×414@3x
这种渲染的坏处和好处都很明显,坏在带来了额外的性能损失,好在根本不需要考虑 App 的兼容性,App 不需要做任何适配工作就能完美支持。

一块 4k 的屏幕,渲染 1080p 的逻辑分辨率,显卡只需要渲染 4k
但是同样 4k 屏,渲染 1440p 的逻辑分辨率,显卡需要渲染 5k 。此时仍然能利用高分屏的优势,并且屏幕字体没那么大。观感上就比较舒适,类似 Ultrafine 5k 。代价就是显卡渲染负担加重些许。

如果苹果不限制可用的分辨率类型,那么,一台 4k 屏幕,同时实现“字体变小”和“利用高分屏”的物理极限就是 8k ( 4k@2x ),此时的状况就类似全屏开了 2 倍抗锯齿。

但是,苹果在 2012 年引入 HiDPI 的概念时,很多显卡其实是不支持渲染物理 8k 的分辨率的,无论是驱动还是显卡性能本身都无法实现“渲染 8k”的结果。那到底通过什么去判断一台显示屏,OS 究竟允许怎样的渲染分辨率呢?如何平衡虚拟高分辨率带来的性能损失,和开启虚拟分辨率带来的观感提升,其实没有一个明确标准,需要综合考虑显卡支持程度和性能损耗。苹果的判断大体上是“DPI 接近 2x”并且“显卡支持”的分辨率。因此我认为苹果选择白名单某种程度也是一种无奈之举。

类似 LG 28mq780 的 2560×2880 ,如果选择翻倍(实际期望值会比翻倍略小),显卡就需要渲染 5120 * 5760 的分辨率,这种超过 5k 的分辨率已经对相当一部分 MacBook ,尤其是 13 寸 intel 核显的机器,形成相当大的负担,甚至有可能直接不支持。此时 macOS 其实无法判断用户真的想默认开这种“字体大一点”,但是“性能狂掉”的高 DPI 模式的。

综上所述,白名单似乎是一种“保全体验的无奈之举”,符合苹果“替用户做最优秀选择”的产品逻辑

但是 Windows 上,情况就不一样了。Windows 一开始就选择了一条看似完美的方法:系统提供 DPI 缩放,由 App 适配。这样几乎没有性能损失,毕竟如果一台 27 寸 4k 分辨率的屏幕打游戏,4k 分辨率还是能有显卡能跑满的,但是如果 Windows 像 macOS 一样默认渲染了 5k ,游戏帧数直接就能掉一半还多,微软怎么想也不能让这种事发生。而且提供 DPI 缩放,也能避免 macOS 渲染高 DPI 时“字体模糊”的问题。毕竟 macOS 的 downsampling 实现无法实现点对点的显示。

但问题就出在 App 适配上,哪有那么多 App 适配这套玩意!众多的早就不更新的 App ,每个 App 都用着不同的 UI 库,使用次新的 UWP 库的 App 国内几乎没有,WinUI 就更不可能了。指望每个 App 完美适配 Windows 的 DPI Awareness 几乎不可能。事实上现在大多数 App 甚至都只适配了整数倍缩放( 200%),如果遇到 150%那多半会 fallback 到 100%,更不要提即使适配了,使用多个不同 DPI 显示器的跨屏效果也是一个灾难。这些因素夹杂在一起,让 Windows 笔记本外接显示屏(扩展模式)几乎没有什么体验可言。指望 Windows 做好估计是不太现实。万幸 Nvidia 和 ATI 在两年前都推出了自己的“超虚拟分辨率”逻辑,得益于此,用户一番折腾还是能实现类似 macOS“HiDPI”的整数倍缩放效果了,偏好游戏性能和偏好跨屏兼容性的用户也算皆大欢喜。

如今 Windows 的高 DPI 实现,借用乔布斯的一句名言概括:微软最大的问题是这个公司根本没有品味。Windows 这种“即使丑的无可附加也要保证你 App 正常性能运行”和 macOS“即使硬件兼容性和性能都差到不行也要保证 App 体验”的产品哲学,真是交相辉映。

发表回复

您的电子邮箱地址不会被公开。