K2.08.2DPI-aware bitmap reload设计

位图资源在跨屏移动时需要按目标显示器重新加载对应分辨率

别名: 跨屏重载位图 · @2x 资源切换 · scale-on-move assets

概念解释

窗口从 1 倍屏拖到 2 倍屏,工具栏图标如果仍是启动时解码的那张位图,系统只能把像素拉大,边缘发虚。按目标屏重载位图(DPI-aware bitmap reload)指跨屏之后按新屏的比例重新取对应分辨率的栅格资源,而不是把旧栅格做一次拉伸。矢量、文字可以当场重栅格;已经烤进像素的图标、照片、装饰图没有这一步就会带着源屏的分辨率走。这条假定应用已经知道每块屏的比例;它只谈资源管道在移动当下要换一套像素。

机制

位图的信息量在解码时定死。一张为 1 倍屏准备的 16×16 图标,在 2 倍屏上要铺满 32×32 物理像素,中间的值只能插值,高频细节回不来。反过来,2 倍资源丢到 1 倍屏上再缩小,会混叠、会偏糊,还浪费解码和显存。文字和矢量路径每次绘制都按当前变换生成像素,所以跨屏「自动」变清晰;位图没有这条免费路径。窗口移动是运行中事件,资源表却常常按启动屏建一次。不在 scaleFactor 变化时换资源,等于把源屏的分辨率写进了窗口的一生。多套资源(1x / 2x / 3x)是为了匹配离散的常见比例;中间比例仍要选最接近的一套再缩放,只是起点不再是错的那套。

边界

纯矢量界面几乎没有可重载的位图,这条观察不到。只在一块屏上运行、从不跨屏的窗口,启动时选对那一套即可。照片、视频帧本身就是给定分辨率的内容,重载「对应分辨率」没有意义,该做的是按目标屏的物理像素决定解码或解码后缩放的目标尺寸,避免先解成源屏大小再二次拉伸。远程桌面和投屏若在源端已经画成位图再传,目标屏再清晰也救不回,那是传输管道而不是应用资源表。

怎么落地

  • 为图标、工具栏、光标、装饰图准备按比例分档的栅格,并在窗口进入新屏时按新比例取用,而不是只在启动时解码一次。
  • 矢量能画的控件不要先烘成位图再拉伸;必须用位图时,移动后丢掉旧纹理再解新的。
  • 跨屏拖动过程中不要每帧解码大图,等窗口在目标屏上停稳或面积占优后再换,以免拖动时卡死。
  • 验证:把带工具栏图标的窗口从 100% 屏完整移到 200% 屏,放大截屏逐像素看图标边缘。仍是源屏那套被拉大的,边缘呈块状;重载成功的,边缘应对齐目标屏的像素网格。再拖回去,确认没有继续使用过大的那套造成的混叠。

延伸

  • 同组K2.08.1 应用需感知每个显示器独立的缩放比例而非套用系统全局值 · K2.08.3 未做每显示器感知的应用会在高分屏上出现模糊或错位 · K2.08.4 混合分辨率环境下的字号与间距换算容易产生累积误差
  • 相邻K2.02 多显示器 · K1.02 屏幕尺寸与密度差异
  • 站内检索DPI-aware bitmap · scale-on-move · backing store

同组卡片

快捷操作

分享

分享当前页面

ios_share

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