vlambda博客
学习文章列表

HiDPI是什么?黑苹果如何开启HiDPI?

前文关于HiDPI的相关浅谈均转载自远景论坛@大狐狸尾巴苏卡卡。

「大狐狸尾巴苏卡卡」博客:

https://blog.skk.moe/post/hidpi-what-why-how/

如果你在搜索引擎中输入「HiDPI」,那么你只会找到一堆和黑苹果有关的内容,和一堆注入EDID的「一键开启HiDPI脚本」。

但是,到底什么是HiDPI?什么是「用四个像素渲染一个像素」?我凭自己的拙见水一篇文章,粗浅地介绍一下 HiDPI 的定义、macOS「缩放」的原理,以及相关的逻辑。

HiDPI是什么?黑苹果如何开启HiDPI?

2. HiDPI 的定义——什么是 HiDPI?

HiDPI其实是一个缩写,全称是High Dots Per Inch,字面意思就是「每英寸包含数量更多的像素」,通俗点讲也就是分辨率特别高但是尺寸并不大的屏幕,在市场上被称为Retina(视网膜)屏幕。
HiDPI是什么?黑苹果如何开启HiDPI?

实际上人们在说HiDPI时,他们说的其实是图片里的东西,也就是macOS中的「缩放(Scaled)」。本文要讨论的「HiDPI」也就是——苹果是如何在分辨率更高的Retina视网膜屏幕上渲染和传统屏幕看起来大小相同、却更加清晰的图象的。

2. 什么是「用四个像素渲染一个像素」?

相信很多人都看过下面这张图,也有不少人听说过「用四个像素渲染一个像素」这种说法。那么,这句话到底是什么意思呢?
HiDPI是什么?黑苹果如何开启HiDPI?
下图是一台MacBook Pro,上面显示了一个大大的红色的圆。现在让我们简化一下模型,假设这个红色的圆 只能用8x8个硬件像素来渲染,那么四分之一个圆则要用到4x4个硬件像素。

HiDPI是什么?黑苹果如何开启HiDPI?

如上图所示,如果只用4x4个像素显示一个四分之一圆,圆在每个像素中占据的面积是不同的,在显示时,需要根据圆在每个逻辑像素中占据的面积、通过算法决定该像素的颜色、对边缘进行「虚化」以补偿视觉效果。 
然后有一天,你买了一台带Retina屏幕的MacBook Pro,新的屏幕大小不变、但硬件像素的数量翻了四倍——也就是说,之前那块屏幕上4x4个硬件像素的面积、在新的屏幕上已经可以容纳8x8个硬件像素了。要是在新的Retina屏幕上还用16个硬件像素渲染一个四分之一圆、那么圆的直径就只有之前的一半、面积就只有四分之一了。

HiDPI是什么?黑苹果如何开启HiDPI?

为了确保相同的屏幕上显示内容的密度(在这个例子中,就是这个圆的面积不发生改变),我们可以让新屏幕的四个硬件像素显示旧屏幕一个硬件像素的内容(此时Retina屏幕上的这四个硬件像素显示的颜色完全相同),也就是让一个逻辑像素直接拉伸对应四个硬件像素,如中间的网格图所示。现在圆的面积的确和之前一样大了,但是显示效果(清晰度)没有得到任何提升。
如果要在Retina屏幕上达成右边那张网格图的显示效果,我们还需要一些别的操作。

HiDPI是什么?黑苹果如何开启HiDPI?

如果要提高画面清晰度,画面在渲染时的逻辑像素应该和硬件像素一一对应起来。原来的四分之一圆对应了4x4个逻辑像素(如上图左边的网格图所示)。如果我们先将画面放大4倍,这个四分之一圆就要对应8x8个逻辑像素了。再将画面渲染到8x8的逻辑像素上(如上图中间的的网格图所示)、最后一一对应的显示到8x8个硬件像素上(如上图右边的网格图所示)。现在,相比直接将4x4拉伸到8x8,搭配HiDPI的Retina屏幕还是用8x8个硬件像素渲染一个四分之一圆,圆的面积依然没有发生改变,但是轮廓处「虚化」像素的数量变少了、圆的边缘显得更锐利了。
在传统屏幕上1个硬件像素中显示的内容,在Retina屏幕上需要用4个硬件像素,这就是Retina屏幕「用四个像素渲染一个像素」的含义。我们在使用macOS截图的时候,截取的正是图象放大四倍后这8x8个逻辑像素(而不是放大前的4x4个逻辑像素),因此我们在截图的时得到的图片大小比屏幕显示的分辨率要大。

3. 等等,那么非整数倍的缩放呢?

下图是2019年13寸MacBook Pro的「系统偏好设置」界面中的显示相关设置。2019 年13寸MacBook Pro的屏幕的硬件分辨率是2560x1600。如果四个硬件像素渲染一个逻辑像素,那么这台MacBook Pro进行「HiDPI 缩放」后的逻辑分辨率应该只有1280x800。但是这张截图却直接告诉你,macOS有能力在2560x1600硬件分辨率的屏幕上上显示1680x1050逻辑分辨率的画面。 
HiDPI是什么?黑苹果如何开启HiDPI?
毫无疑问,硬件像素是一个一个独立存在、不能拆开的——没有人能点亮1.5个硬件像素。所以非整数倍的缩放是怎么实现的呢?让我们用逆向思维来思考这个问题。我们的最终目标是将硬件分辨率2560x1600全部都利用起来,这是大前提;为了完全利用2560x1600的硬件分辨率,那么原始逻辑分辨率放大4倍后应该包含2560x1600个逻辑像素,所以放大四倍前的原始逻辑分辨率应该是1280x800个像素。但是为了能容纳1680x1050的逻辑分辨率,需要将1680x1050线性缩放到1280x800,即需要先将原始画面缩小到原来的76.2%。
通过逆向思维,我们把数字算出来了,现在让我们理一理这个流程。假设我们在1680x1050的逻辑分辨率下有一个边长为500个逻辑像素的正方形窗口,macOS的WindowServer会首先将这个正方形窗口缩小到原来的76.2%,也就是381个逻辑像素。接着将这个边长381个逻辑像素窗口的边长放大到原来的两倍(即面积放大到原来的四倍),也就是正方形窗口边长变成了762个逻辑像素。窗口面积放大四倍后,这762x762个逻辑像素和硬件像素是一一对应进行显示的。所以,在这台2019年的13寸MacBook Pro上,边长500个逻辑像素的窗口实际上需要用到762x762个硬件像素,硬件像素的数目比逻辑像素的数量更多、硬件分辨率高于原始逻辑分辨率,我们看到的窗口画面更清晰了。
你理解了吗?你以为你好像理解了,不就是「先按照一定百分比缩小、经过缩小后的画面再放大四倍、就和硬件像素一一对应」了嘛。那我现在把数字换一下,还是这台2019年的13寸MacBook Pro,不过现在正方形窗口的边长是100个逻辑像素而不是500个,乘以76.2%得到76.2、再把边长放大两倍(也就是面积放大四倍)得到152.4个像素。如果要和硬件像素一一对应的话,这0.4个像素怎么办,难道要扔掉吗?
所以要注意一点,我之前举的例子中使用了「缩小到原来的76.2%」这种说法,纯粹是为了便于大家理解「先缩小再放大四倍渲染」的流程,实际上 这个说法是完全错误的。
如果你接触过iOS、macOS应用开发的话,应该会注意到,在macOS、iOS应用中的图片和图标资源的大小使用的单位并不是Pixels(px,像素),而是Points。和像素Pixels必须是正整数不同,Points可以是浮点数、也就是允许拥有小数。Points的单位只代表一种比例关系、和现实世界中(或者显示器屏幕上)占据的实际大小没有任何关系,macOS、iOS会自行计算一个Points应该对应的像素数量。所以所谓「缩小 76.2%」,本质上是一个Points需要对应的Pixels数量减少了而已。除此以外,macOS、iOS在渲染图象时还会通过vector方法保留画面的线条、并得到更加锐利的边缘。

4. 黑苹果如何开启HiDPI?

一键开启HiDPI教程如下:
❶ 下载GitHub作者压缩包原件或我为大家准备好的压缩包;
作者提供:
https://github.com/xzhih/one-key-hidpi
已下载好的压缩包:
https://wwe.lanzoui.com/if0jCq82m4h

HiDPI是什么?黑苹果如何开启HiDPI?

 解压缩包,找到hidpi.command,打开方式为终端(如下图);

HiDPI是什么?黑苹果如何开启HiDPI?

❸ 下图选项浅显易懂,大家根据自己的要求输入相应的序号即可;

HiDPI是什么?黑苹果如何开启HiDPI?

 如果需要开启HiDPI,可以输入“1”或“2”,我建议输入“2”,然后回车;

HiDPI是什么?黑苹果如何开启HiDPI?

 在此选择自己的显示器图标,由于我的电脑是笔记本,我输入“3”后回车。其实我也可以输入其他,不过为了显示器图标与设备不违和,还是选择了输入“3”;
如果在输入相应序号后,弹出需要输入密码的话,那就输入你的开机密码后回车,不过输入过程不显示密码。 笔记本建议选择MacBook Pro或MacBook。台式机建议选择iMac或Pro Display XDR,其中Pro Display XDR的显示器图标比较好看。

HiDPI是什么?黑苹果如何开启HiDPI?

 选择分辨率配置,我选择的是输入“6”,手动输入配置自己的分辨率;
大家可以根据自己显示器分辨率和屏幕尺寸来进行选择。以我自己为例,我的笔记本屏幕分辨率是2256*1504,屏幕比例是3:2。虽然也属于2K屏幕,但我不能选择输入“4”。因为我的屏幕比例是3:2,而不是16:9。如果贸然选择的话,会导致我的系统显示面积不会填充满整块屏幕,这样的显示是没有意义的。
那么,如果我选择输入“5”呢?它的显示比例不也是3:2吗?
我试过了,还是不行,不能成功开启HiDPI。我觉得造成这种原因可能是屏幕本身的分辨率并不是3000*2000,硬件素质达不到,所以不能选。
最终,我还是决定在2256*1504这个分辨率范围内找合适的3:2屏幕分辨率,来一一进行尝试,然后删选。以下是我尝试过的所有3:2比例屏幕,2256*1504分辨率范围内的所有分辨率:
1500*1000、1350*900、1200*800、1050*700
这4个分辨率中,只有1200*800这个分辨率成功开启了HiDPI,开启后显示效果完美,并没有什么副作用。
总结和建议:大家可以根据我的这个方法去尝试开启HiDPI。 建议1920*1080分辨率开启HiDPI的最佳分辨率是1424*802或者1280*720。其他分辨率我还没有尝试过,大家自行去尝试吧。

HiDPI是什么?黑苹果如何开启HiDPI?

HiDPI是什么?黑苹果如何开启HiDPI?

 开启成功,重启电脑;

HiDPI是什么?黑苹果如何开启HiDPI?

❽ 重启电脑后,在设置/显示器内查看是否成功(下图表示成功开启);

HiDPI是什么?黑苹果如何开启HiDPI?

❾ 如果有童鞋想要关闭HiDPI的话,就在下图界面输入“3”后回车,再输入“2”即可。

HiDPI是什么?黑苹果如何开启HiDPI?

HiDPI是什么?黑苹果如何开启HiDPI?

5. 写在最后

以上,就是本次想和你分享的内容。

如果有帮到你,你可以点击「在看」转发分享,这会对我有很大的帮助。

HiDPI是什么?黑苹果如何开启HiDPI?