K2.08.1per-monitor DPI设计研究

应用需感知每个显示器独立的缩放比例而非套用系统全局值

别名: 每屏缩放 · 每显示器 DPI · display scale factor

概念解释

笔记本屏设成 200%,外接显示器设成 100%,两块屏同时亮着。每显示器缩放(per-monitor DPI)指每一块屏有自己的逻辑像素到物理像素比例,应用必须问「这扇窗口现在所在的那块屏是多少」,而不是读一个系统级的全局 DPI 拿来到处用。全局值会让其中一块屏上的界面要么小到读不动,要么大到放不下。这条只谈「比例是每屏一份」;位图要不要重载、模糊和错位长什么样、字号换算怎么累积误差,都不在这里。

机制

操作系统把缩放做成显示器属性,不是进程属性。窗口的有效比例通常取「窗口面积占得最多的那块屏」,或取窗口中心所在的屏;跨屏拖动时,这个归属会变。早期桌面把 DPI 当成机器常数——一台电脑一个值,所有窗口共用。混合分辨率出现后,那个常数必然对其中一块屏撒谎。应用若在启动时读一次系统 DPI 并缓存,之后插上第二块屏、或把窗口拖过去,用的仍是第一块屏的比例。逻辑坐标和物理像素之间的变换必须以当前屏为准,否则点击坐标、文字栅格、边框宽度会按错误的倍数去乘。

怎么研究

搭一套双屏:一块整数倍缩放(200%),一块非整数或 100%,让同一窗口在两块屏上停留。比较「读全局 DPI」和「按窗口所在屏查询」两种实现。

自变量:两屏各自的缩放、窗口相对两屏的面积占比、查询发生在启动时还是进入该屏时。 因变量:同一控件在两块屏上的物理尺寸是否接近、点击是否落在可见控件内、用户是否觉得「拖过去忽然变了套界面」。

用尺子量屏幕上一条标称为 1 厘米的线,比看截图像素更接近人的感知。实验室若两块屏设成同一比例,每屏独立这件事根本测不到。不要把「两块屏色温不同」或「菜单被裁在屏边上」算进这条——那是另一组多屏问题。

边界

单屏机器上全局值与每屏值重合,这条没有观察窗口。两块屏被操作系统强制成同一缩放时,错误的全局读取也不会暴露。全屏独占、不跨屏移动的应用(游戏、演示)只需要启动时所在屏的比例。浏览器或跨平台工具包若由系统合成器统一缩放整块后备缓冲,应用层读到的可能已经是逻辑像素,再乘一次会加倍。

怎么落地

  • 在窗口移入某块屏、显示器热插拔、用户改该屏缩放时重新查询该屏比例,不要缓存启动时的系统值。
  • 布局、命中测试、文字栅格都使用窗口当前屏的比例;不要把主屏比例套到副屏窗口上。
  • 跨屏拖动过程中比例会跳变,按「面积占优的屏」更新,避免窗口骑在边上时来回抖动。
  • 验证:主屏 200%、副屏 100%,把同一窗口完整移到副屏。控件的物理大小应仍接近可读,点击应对准可见像素。任何「只有重启才正常」都说明比例被当成了进程常量。

延伸

  • 同组K2.08.2 位图资源在跨屏移动时需要按目标显示器重新加载对应分辨率 · K2.08.3 未做每显示器感知的应用会在高分屏上出现模糊或错位 · K2.08.4 混合分辨率环境下的字号与间距换算容易产生累积误差
  • 相邻K2.02 多显示器 · K1.02 屏幕尺寸与密度差异
  • 站内检索per-monitor DPI · display scale factor · logical pixels

同组卡片

快捷操作

分享

分享当前页面

ios_share

https://hci.top/zh/handbook/K2.08.1