dpi 是“Dots Per Inch”的缩写,表示每英寸的像素点个数,也就是像素点的密集度。

dpi不是用来表示屏幕分辨率的,也不是用来表示屏幕物理尺寸的。

dpi = 总像素点 / 物理面积

比如一个 32 寸的显示,但分辨率只有1920*1440,而一个 24 寸的显示器,分辨率却达到3840*2160,很明显后面这个显示器的每英寸的像素点的个数多,显示的画面更加细腻。
所以:高分辨率不等于高 dpi。

苹果的视网膜屏幕的核心就是高 dpi:屏幕物理面积小,而分辨率高达 5k,每英寸的像素点(dpi)固然多,画面自然细腻。

软件显示异常

为什么高 DPI 显示器会导致某些软件显示异常了?

随着 2K、4K 显示器的普及,在使用这些高 DPI 显示器时,我们为了使软件界面看起来不至于太小,导致视觉疲劳,一般会在系统中设置缩放比例。

Windows 操作系统对高 dpi 显示器缩放支持最好的是 windows 10+,建议在使用高 DPI 显示器时搭配 Windows 10+操作系统。

假设现有一个软件,其界面宽 950 像素,高 700 像素,该软件在 24 寸、分辨率为1900*1400的显示器上显示正常,但放到高 dpi 显示器(同样是 24 寸,但分辨率为3800*2800)上显示效果会如何?

从上图可以看到,同样尺寸的软件界面,在高 dpi 显示器上会显得非常小,会对使用者会造成严重的视觉疲劳。

所以我们的软件需要针对高 dpi 进行适配和缩放,从而发挥出高dpi显示器的优势,让界面显示更加清晰和细腻。

目前大多数客户端框架(如Qt、Electron、WPF、WinForm)都已经能很好的支持dpi缩放了,不需要开发人员花费经历去处理这些事情。

Windows 10+系统的DPI缩放规则

Windows 10+操作系统针对 dpi 缩放制定了 3 种规则,每个进程都必须匹配下面的一种规则,默认为PROCESS_DPI_UNAWARE

  1. PROCESS_DPI_UNAWARE
    在软件启动时, 操作系统会自动将软件进行缩放拉伸;在系统 dpi 缩放改变时,系统也会将软件自动进行缩放拉伸,但软件不会收到 WM_DPICHANGED 消息。
  2. PROCESS_SYSTEM_DPI_AWARE
    在软件启动时,系统不会将软件进行缩放拉伸;但在系统 dpi 缩放改变时,系统会将软件进行缩放拉伸,但软件仍然不会收到 WM_DPICHANGED 消息。
  3. PROCESS_PER_MONITOR_DPI_AWARE
    在软件启动时,系统不会将软件进行缩放拉伸;同样,在系统 dpi 缩放改变时,系统也不会将软件进行缩放拉伸,但软件会收到 WM_DPICHANGED 消息。

详见:dpi_awareness