×

Mac系统HiDPI问题

96
北静王
2017.07.20 23:54* 字数 1756

我用mac就是因为人家好看,还好用。再不济我会选择Linux,因为人家好用而且也不丑。

** 重要的事情说3遍,连接Macbook和显示器的线缆一定是DP口的。**
** 重要的事情说3遍,连接Macbook和显示器的线缆一定是DP口的。**
** 重要的事情说3遍,连接Macbook和显示器的线缆一定是DP口的。**

0. 我们看屏幕的时候到底看到的是什么?

RGB颜色模型
RGB颜色模型

先给大家普及下基础的成像技术。所有的电子显示器(二极管或是液晶)都是通过色彩的混合来完成图像的显示,回想下我们小学学习的三原色知识,通过RGB能够混合出大部分的色彩。但是工业上出了使用RGB之外,还有pRGB,YCbCr等色彩表示(还有其他的色彩表示和混合方式,不深究)。我们都知道8个比特位能表示256种可能,这也是大部分RGB显示器所能表示的范围,一共3个8位的比特位,能够表示的就是![](http://www.forkosh.com/mathtex.cgi? \Large 2^{24}=16 777 216)次方,也就是1600万色,这也就是大多数广告中提到的1600万色的来源,当然现在很多现实器都支持10bit广色域,关于色彩问题这可是有很深的历史和文化渊源的,大家耳熟能详的有Adobe公司的颜色模型,苹果公司的颜色模型,还有一些其他我也不知道的专业制图公司的颜色模型,反正这东西涉及到色彩心理学的知识,我不懂

对于一般人每天接触最多的电子屏幕就是手机的点子屏幕啦,从最初的蓝屏到今天的OLED,从几百像素到2k屏幕。手机上的屏幕是由一个个发光的点组成的点阵,最初碍于技术每个“灯泡”做的都很大,灯泡之间的间隔也很大,所以会有“像素感”,就想下面的Nokia的蓝屏手机。

大手牵小手

随着技术的进步,相同大小的屏幕能够放进去更多的”灯泡“,分辨率也在逐步提升,以至于我们人眼不再分辨出”颗粒感“,也就是屏幕的分辨率和你视网膜的分辨率一样大,或是屏幕的分辨率更大的时候我们得到了一个”视网膜“屏幕。

当我们有了一个大的分辨率屏幕的时候,我们想要显示的内容的分辨率是一定的时候,显示内容在屏幕上占有的实际面积就越来愈小。我们看着当然不爽,最简单的解决办法就是用4个发光的灯泡来显示同样的一个色彩点,对硬件设备的分辨率进行下采样,这样在屏幕上显示的面积就是原来的4倍大小,但是并没有降低视觉上的分辨率。

1. 什么是HiDPI技术?

HiDPI (High Dots Per Inch) displays, also known by Apple's "Retina Display" marketing name, are screens with a high resolution in a relatively small format. They are mostly found in high-end laptops and monitors.
Not all software behaves well in high-resolution mode yet. Here are listed most common tweaks which make work on a HiDPI screen more pleasant.

简单来说就是在硬件设备上面使用多个像素点位置来合成一个我们看到的像素。这需要的是软件的支持和一款大分辨率屏幕。


乔帮主在介绍retina屏幕

上么的图显示的是乔布斯在介绍“Retina”技术,左边是一般的屏幕的抗锯齿算法,由于屏幕实际分辨率的限制,造成了窗口或字体会有一种毛刺的效果。而右边的则是macbook上应用的视网膜技术,由于分辨率提升了一倍,所以看着会更顺滑,所以在mac上看文档,打字真的是一种享受。


高分辨率(上)和低分辩率(下)实际效果

我们可以简单的将右边的技术理解为HiDPI技术,如果我们按照屏幕实际的分辨率来调整桌面的话,你会发现系统的字体会很小,并且窗口和字体会出现模糊毛边的效果,如果单纯的降低分辨率的话,字体倒是变大了,但是模糊和毛边的效果更加严重了,这就是单纯降低分辨率而不做抗锯齿操作会放大锯齿的后果。

2.实际操作

先贴下我的硬件信息:

笔记本:Macbook pro 2012(975,带一块低端的1G独显)
显示器:Dell U2417H+Dell U2518DR
       实际分辨率分别是1920 x 1080和2560 x 1440。
系统版本:macOS Sierra (ver 10.12.5)

我一下午重启了无数次电脑都没有成功的原因就是用了一条HDMI的线缆。最后换了线缆成功的那一刻,内心真的是。


去你妈的HDMI

今天心心念的屏幕到了,连午饭都没吃就开始将Dell U2417H替换下来,装上新的Dell U2518DR,为什么选择这两款屏幕。因为这两款屏幕真的是很惊艳,四个边框真的很窄。大家可以找找网上的评测,其中2417是2414的升级版,2518是2515的升级版。本来想直接上一款4k的屏幕,后来担心我那岁数大的macbook带不动就万事休矣。最后选择了一款1080和一款2k的先凑合用着。当然上面的都是废话,下面直接切入正题:怎么在2k屏幕上面显示成retina内建屏幕的效果。

mac的retina屏幕自带缩放模式,在win下用户遇到的问题是当屏幕的分辨率越高的时候,系统字体会比较小,可以使用缩放来完成字体的放大(比如放大到原来的150%)。但是当mac外接屏幕的时候,他的缩放就显得有点鸡肋了,当然如果你外接的是4k或是5K的屏幕的时候,屏幕本事自带的是HiDPI就能解决字体过小、模糊不平滑问题。这个已经向好友刚子求证过了。只记住了他对高分辨率屏幕的点评:原来括号是这样子的啊。

之前用1080分辨率(23.8寸)屏幕的时候已经能感觉出很大的颗粒感了,原因是习惯了mac自己的屏幕,就像你看惯了1080P的电影再看720p的电影会很难受,就像你听惯了无损的歌曲,再听320k的歌曲的时候耳朵受不了一个样子。

感谢大家看到这里还在看,这篇非技术贴。下面是干干干货。


方案一(未测试):
这种方法适宜程序员类,或是你熟悉Mac的操作。

  • 管理员权限运行下方的命令开启本机的HiPDI选项
    sudo defaults write /Library/Preferences/com.apple.windowserver.plist DisplayResolutionEnabled -bool true

  • ioreg -l | grep "DisplayVendorID"
    ioreg -l | grep "DisplayProductID"
    上面的两个命令会返回两个带10进制数字的结果,记下来,转换成16进制数字,其中第一个是用来命名文件夹的,第二个是用来命名文件的。

  • 在任意位置(桌面上比较好)建立一个文件夹,并在文件夹中命名一个文件,其中文件夹的名字为DisplayVendorID-XXX,文件的名字为DisplayProductID-XXX,XXX则是前面转换成16进制的两个数字。

  • 文件的内容是一个plist格式的文件,内容如下,可以使用xcode编辑工具编辑。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>DisplayProductID</key>
        <integer>10496</integer>
        <key>DisplayVendorID</key>
        <integer>8547</integer>
        <key>scale-resolutions</key>
        <array>
                <data>
                AAAKAAAABkAAAAABACAAAA==
                </data>
                <data>
                AAAUAAAADIAAAAABACAAAA==
                </data>
                <data>
                AAAKAAAABDgAAAABACAAAA==
                </data>
                <data>
                AAAUAAAACHAAAAABACAAAA==
                </data>
                <data>
                AAAHgAAABDgAAAABACAAAA==
                </data>
                <data>
                AAAPAAAACHAAAAABACAAAA==
                </data>
                <data>
                AAAGkAAABBoAAAABACAAAA==
                </data>
                <data>
                AAANIAAACDQAAAABACAAAA==
                </data>
                <data>
                AAAGQAAAA4QAAAABACAAAA==
                </data>
                <data>
                AAAMgAAABwgAAAABACAAAA==
                </data>
                <data>
                AAAFoAAAA4QAAAABACAAAA==
                </data>
                <data>
                AAALQAAABwgAAAABACAAAA==
                </data>
                <data>
                AAAINAAAA4QAAAABACAAAA==
                </data>
                <data>
                AAAQaAAABwgAAAABACAAAA==
                </data>
        </array>
</dict>
</plist>

如果我想使用AxB的分辨率,那么我需要同时添加一个AxB和2Ax2B的分辨率,一个原始分辨率和一个加倍的分辨率。

  • 最后把文件夹直接拷贝到/System/Library/Displays/Contents/Resources/Overrides/

方案二(已经测试):
使用软件SwitchResX,不过最新的系统会有点问题,请参考这篇文章解决解决方案

方案三(已经测试):
按照这个Github中的步骤利用脚本为本机开启HiDPI选项。Github地址

方案四(未测试):
这个Github的项目貌似更加靠谱。Github地址

参考

  1. Wiki-HiDPI
  2. 有关retina和HiDPI那点事
  3. 分不清HiDPI和Retina显示器?─ 认识4K时代的像素密度
  4. How to Enable HiDPI Mode in Mac OS X
  5. macOS-10-12-Sierra开启HiDPI
210
Web note ad 1