分辨率)
簡介圍繞 macOS 開啟 HiDPI 的實(shí)用腳本包面向使用舊款 Mac 或中低分辨率外接顯示器的用戶旨在繞過系統(tǒng)設(shè)置限制讓字體、圖標(biāo)與窗口以更高像素密度渲染獲得更清晰細(xì)膩的觀感適合設(shè)計(jì)師、圖像編輯者及希望改善日常辦公顯示效果的人群。壓縮包共 14 個(gè)文件約 2.05MB包含可直接執(zhí)行的 sh 與 command 腳本、plist 配置、icns 顯示圖標(biāo)、jpg/gif 效果預(yù)覽以及中英文 md 說明兼顧一鍵啟用與操作參考目錄組織緊湊便于按用途查找。已有 2054 人學(xué)習(xí)下載說明它在舊設(shè)備顯示優(yōu)化場景中具有一定參考價(jià)值。讀者可借助腳本簡化傳統(tǒng)上需依賴 RDM 等圖形工具或手動(dòng)修改系統(tǒng)參數(shù)的流程并通過預(yù)覽圖與說明快速判斷效果、理解配置思路同時(shí)應(yīng)留意系統(tǒng)文件讀寫帶來的風(fēng)險(xiǎn)操作前做好備份并理解部分應(yīng)用對(duì)高分辨率適配有限。1. 先看清這套環(huán)境的底同一塊 4K 屏Mac 只給兩檔macOS 開啟 HiDPI 這件事在外接 4K 屏的機(jī)器上幾乎是剛需。上周幫人調(diào)一臺(tái) M 芯片的機(jī)器27 寸 4K 面板插上去系統(tǒng)設(shè)置里只有 1920×1080 和 3840×2160 兩個(gè)選項(xiàng)中間 2560×1440、3008×1692 那一大片全空著字看著發(fā)虛縮放又全是插值算出來的。問題不在顯示器也不在線材是 macOS 對(duì)沒有進(jìn)過它內(nèi)部白名單的面板默認(rèn)不生成縮放模式。一套跟著系統(tǒng)版本走的顯示覆蓋文件就能補(bǔ)上代價(jià)是改錯(cuò)了得能退回來。這套流程適合手里有外接屏、被默認(rèn)檔位卡住的開發(fā)者也適合第一次碰顯示覆蓋文件、想先搞清原理再動(dòng)手的人。2. 裝前準(zhǔn)備系統(tǒng)版本、面板 ID 與三條路線先對(duì)齊動(dòng)手之前有三件事必須先定下來走哪條路線、系統(tǒng)版本落在哪一檔、原始配置怎么留底。這三件沒對(duì)齊就敲命令后面大概率是改完沒效果或者有效果但重啟就沒了排查起來比裝一遍還費(fèi)時(shí)間。2.1 三條路線的取舍覆蓋文件、虛擬屏、手寫 plistmacOS 的縮放檔位不是實(shí)時(shí)算出來的而是從一份「顯示器覆蓋文件」里讀出來的。系統(tǒng)在/System/Library/Displays/Contents/Resources/Overrides/下按面板的 VendorID 和 ProductID 建目錄目錄里放一份 plistplist 里的scale-resolutions數(shù)組就是你在系統(tǒng)設(shè)置里看到的那幾個(gè)檔位。面板匹配不上系統(tǒng)就只按 EDID 里的原生分辨率給你生成兩檔這就是中間檔位消失的直接原因。第一條路線是往/Library/Displays/Contents/Resources/Overrides/放一份同名的覆蓋文件。這個(gè)目錄的優(yōu)先級(jí)高于系統(tǒng)目錄不需要?jiǎng)酉到y(tǒng)卷也不需要關(guān) SIP從 macOS 10.15 開始就是官方留給用戶改的地方。優(yōu)點(diǎn)是干凈缺點(diǎn)是必須精確匹配 VendorID 和 ProductID寫錯(cuò)一個(gè)字符就不生效。第二條路線是用 BetterDisplay 這類應(yīng)用創(chuàng)建一塊虛擬顯示器。它不改系統(tǒng)文件而是在系統(tǒng)之上再疊一層把虛擬屏的畫面輸出到真實(shí)屏上。好處是隨時(shí)可關(guān)、不怕系統(tǒng)更新壞處是多一層合成某些對(duì)刷新率和色彩管理敏感的場景要額外調(diào)。第三條路線是自己手寫 plist。它和第一條其實(shí)是同一件事區(qū)別只在于你不用腳本、全部手敲??煽匦宰罡咭沧钊菀自?data 編碼上翻車。我一般的取舍是4K 外接屏、只想要幾檔常用分辨率走第一條機(jī)器經(jīng)常換屏、或者要給不同面板分別調(diào)走第二條只有前面兩條都失敗了才回到第三條慢慢磨。2.2 環(huán)境清單與版本對(duì)照表版本這一塊最大的分水嶺是 macOS 10.15。在這之前覆蓋文件只能放在系統(tǒng)卷里必須關(guān)掉 SIP 才有寫權(quán)限10.15 之后/Library下的那份就生效了SIP 保持開啟也能改。再往后到 Apple Silicon 時(shí)代啟動(dòng)卷是簽名的改/System基本無望所以只能走/Library。系統(tǒng)版本區(qū)間覆蓋文件目錄是否需要關(guān) SIP生效方式10.13 – 10.14/System/Library/Displays/Contents/Resources/Overrides需要重啟10.15 – 11/Library/Displays/Contents/Resources/Overrides不需要注銷或重啟窗口服務(wù)12 – 13同上不需要注銷或重啟窗口服務(wù)14 及以上同上不需要多數(shù)情況注銷即可個(gè)別機(jī)型要重啟除了系統(tǒng)版本還要確認(rèn)兩件事。一是芯片類型Intel 機(jī)器上還有一些老命令能用Apple Silicon 上很多都不適用別照著幾年前的帖子抄。二是顯示器是內(nèi)置屏還是外接屏內(nèi)置屏的 VendorID 一般是610外接屏是面板廠商自己的編號(hào)兩者要分開處理混在一起寫會(huì)互相覆蓋。# 查看系統(tǒng)版本與芯片架構(gòu)決定后面走哪條路 sw_vers uname -m # 確認(rèn) SIP 狀態(tài)Apple Silicon 上基本不用動(dòng)它 csrutil status # 列出當(dāng)前已連接的顯示器信息包括分辨率和連接類型 system_profiler SPDisplaysDataTypesw_vers給出三個(gè)字段重點(diǎn)看ProductVersion它決定覆蓋文件放哪兒。uname -m輸出arm64還是x86_64決定后面重建緩存那一步要不要跳過。csrutil status只有在你確實(shí)要改系統(tǒng)卷時(shí)才需要關(guān)心走/Library路線的話看到enabled反而是好事不用去動(dòng)它。system_profiler那一條用來確認(rèn)顯示器到底有沒有被識(shí)別成外接屏如果這里壓根沒列出你的顯示器先解決線材和接口的問題別急著寫覆蓋文件。2.3 留一份能一鍵回滾的備份這一步很多人跳過然后在改壞之后花兩小時(shí)找原始文件。覆蓋文件改錯(cuò)的表現(xiàn)不一定是黑屏更常見的是分辨率列表變成空白、外接屏直接不亮、或者內(nèi)置屏亮度調(diào)節(jié)失效。有備份的話刪掉自己加的那份就恢復(fù)了。# 建一個(gè)帶時(shí)間戳的備份目錄放在家目錄下別放 /tmp mkdir -p ~/hidpi-backup/$(date %Y%m%d) # 備份 /Library 下已有的覆蓋文件如果之前沒改過這里可能是空的 sudo cp -R /Library/Displays/Contents/Resources/Overrides \ ~/hidpi-backup/$(date %Y%m%d)/library-overrides 2/dev/null # 記錄一份當(dāng)前可用分辨率的快照出問題時(shí)拿來對(duì)比 system_profiler SPDisplaysDataType ~/hidpi-backup/$(date %Y%m%d)/displays-before.txt第一段命令建目錄日期戳是為了多次嘗試時(shí)不互相覆蓋。第二段的2/dev/null是有意加的因?yàn)闆]改過的機(jī)器上這個(gè)目錄可能不存在cp會(huì)報(bào)錯(cuò)但那個(gè)報(bào)錯(cuò)沒有意義屏蔽掉更清爽。第三段的快照很關(guān)鍵它記錄的是「改之前系統(tǒng)認(rèn)得的模式」改完之后再跑一次同樣的命令做對(duì)比能立刻看出是多了檔位還是整個(gè)顯示器都掉了。備份做完還要確認(rèn)一件事你有沒有裝過其他顯示管理工具。如果之前裝過類似的應(yīng)用它可能已經(jīng)在/Library下留了自己的覆蓋文件這時(shí)候直接覆蓋會(huì)把它頂?shù)?。用ls -la看一眼目錄里有什么心里有個(gè)數(shù)再動(dòng)手。3. 腳本注入從 ioreg 摳出面板 ID再拼 base64這條路線做的事其實(shí)很樸素讀出面板的 VendorID 和 ProductID按這兩個(gè)值建目錄和文件把想要的分辨率編碼成 plist 認(rèn)識(shí)的格式寫進(jìn)去最后讓窗口服務(wù)重新加載。麻煩的地方全在編碼那一步格式錯(cuò)一個(gè)字節(jié)系統(tǒng)就當(dāng)這份文件不存在。3.1 用 ioreg 讀出 VendorID 與 ProductID系統(tǒng)認(rèn)顯示器的依據(jù)是 IODisplayPrefsKey這個(gè)鍵里就帶著兩個(gè)十六進(jìn)制 ID。網(wǎng)上很多帖子讓你去「關(guān)于本機(jī)」里翻那里看不到必須從 ioreg 里取。# 從 IO 注冊表里過濾出顯示器的偏好鍵一行就能看到兩個(gè) ID ioreg -lw0 | grep -i IODisplayPrefsKey # 如果上面一條輸出太多用這條只保留外接屏相關(guān)的部分 ioreg -rc AppleCLCD2 -l | grep -i DisplayProductID\|DisplayVendorID第一條命令的輸出長這樣IODisplayPrefsKey IOService:/AppleACPIPlatformExpert/PCI00/.../DisplayVendorID-10ac/DisplayProductID-a0e8。你要的就是最后兩段10ac是 VendorIDa0e8是 ProductID都是十六進(jìn)制轉(zhuǎn)換的時(shí)候不要加0x前綴也不要去掉前導(dǎo)零。第二條命令是備用手段某些系統(tǒng)版本上第一條抓不到用AppleCLCD2這個(gè)類名能撈出來。兩個(gè) ID 必須成對(duì)使用只對(duì)上一個(gè)沒用——目錄名是DisplayVendorID-10ac文件名是DisplayProductID-a0e8兩者拼起來才是完整的匹配路徑。如果機(jī)器上接了多塊屏ioreg 會(huì)輸出多組鍵這時(shí)候要按順序?qū)?yīng)。分辨方法是看鍵路徑里的端口編號(hào)或者干脆拔掉一塊屏再跑一次看哪一組消失了。內(nèi)置屏的 VendorID 固定是610看到這個(gè)值就知道對(duì)應(yīng)的是筆記本自己的屏幕。3.2 把目標(biāo)分辨率編碼成 base64 的 dataplist 里的scale-resolutions不是一個(gè)簡單的數(shù)字?jǐn)?shù)組而是一組data每個(gè)data是 16 個(gè)字節(jié)按大端序拆成四段寬、高、標(biāo)志位、像素格式。手算很容易錯(cuò)所以我一般用一段 Python 生成粘進(jìn)去就行。# gen_scale.py生成 plist 里 scale-resolutions 需要的 base64 data import base64 import struct # 目標(biāo)邏輯分辨率列表按你想要的檔位改這里 # 4K 面板常見的幾檔1920x1080、2560x1440、3008x1692、3360x1890 RESOLUTIONS [ (1920, 1080), (2560, 1440), (3008, 1692), (3360, 1890), (3840, 2160), ] def make_entry(width, height): # IIII 表示四個(gè)大端 32 位無符號(hào)整數(shù)寬、高、標(biāo)志位、像素格式 # 標(biāo)志位填 1 表示該模式有效并標(biāo)記為 HiDPI # 0x00200000 是 32 位 ARGB 像素格式基本是固定值 return struct.pack(IIII, width, height, 1, 0x00200000) for w, h in RESOLUTIONS: encoded base64.b64encode(make_entry(w, h)).decode() print(fdata{encoded}/data)跑python3 gen_scale.py會(huì)輸出若干行data標(biāo)簽每行對(duì)應(yīng)一個(gè)分辨率直接把這幾行貼進(jìn) plist 的array里就行。參數(shù)上有兩個(gè)點(diǎn)值得說清楚RESOLUTIONS里填的是邏輯分辨率也就是你在系統(tǒng)設(shè)置里看到的那串?dāng)?shù)字實(shí)際渲染會(huì)按兩倍去算所以 1920×1080 這一檔在 4K 面板上是像素級(jí)完美匹配而 2560×1440 需要超采樣再降下來清晰度略遜但視野更大。0x00200000這個(gè)像素格式值不要亂改改成別的值系統(tǒng)可能認(rèn)不出這個(gè)模式。標(biāo)志位那個(gè)1也別省省掉之后模式會(huì)生成但不帶 HiDPI 標(biāo)記菜單里出現(xiàn)的還是普通分辨率。3.3 寫文件、改權(quán)限、讓窗口服務(wù)重新加載有了 base64剩下的就是把 plist 拼出來。下面這份是模板DisplayProductName決定菜單里顯示的名字隨便寫但不要留空。?xml version1.0 encodingUTF-8? !DOCTYPE plist PUBLIC -//Apple//DTD PLIST 1.0//EN http://www.apple.com/DTDs/PropertyList-1.0.dtd plist version1.0 dict keyDisplayProductName/key stringExternal 4K/string keyDisplayProductID/key integer41216/integer keyDisplayVendorID/key integer4268/integer keyscale-resolutions/key array !-- 下面這幾行由 gen_scale.py 輸出逐行粘貼 -- dataAAAAB4AAAQ4AAAABACAAAA/data dataAAAACgAABaAAAAABACAAAA/data dataAAAAC8AABpgAAAABACAAAA/data /array /dict /plist兩個(gè)整數(shù)字段要和文件名對(duì)得上但注意這里填的是十進(jìn)制。前面拿到的10ac和a0e8要先轉(zhuǎn)成十進(jìn)制再填進(jìn)來10ac是 4268a0e8是 41216。也有人干脆不寫這兩個(gè) key系統(tǒng)只按文件名匹配兩種寫法都能生效我傾向于寫上方便日后核對(duì)。文件放好之后權(quán)限必須改root:wheel加644普通用戶權(quán)限的文件窗口服務(wù)讀不到。# 按前面拿到的 ID 建目錄注意全部小寫 sudo mkdir -p /Library/Displays/Contents/Resources/Overrides/DisplayVendorID-10ac # 把拼好的 plist 拷進(jìn)去文件名必須和 ProductID 完全一致 sudo cp ~/hidpi-work/DisplayProductID-a0e8 \ /Library/Displays/Contents/Resources/Overrides/DisplayVendorID-10ac/ # 權(quán)限和屬主都要改這一步漏了就是白干 sudo chown -R root:wheel /Library/Displays/Contents/Resources/Overrides/DisplayVendorID-10ac sudo chmod 644 /Library/Displays/Contents/Resources/Overrides/DisplayVendorID-10ac/DisplayProductID-a0e8 # 先用 plutil 檢查語法格式不對(duì)會(huì)直接報(bào)出來 plutil -lint /Library/Displays/Contents/Resources/Overrides/DisplayVendorID-10ac/DisplayProductID-a0e8 # 重啟窗口服務(wù)讓配置重新加載當(dāng)前會(huì)話會(huì)被注銷 sudo killall WindowServerplutil -lint那一步是必做的它會(huì)告訴你 plist 結(jié)構(gòu)有沒有問題比如少個(gè)閉合標(biāo)簽、data里混進(jìn)了非法字符。這一步過了文件本身就沒毛病后面不生效只能是 ID 匹配或緩存的問題。killall WindowServer會(huì)直接注銷當(dāng)前會(huì)話所有沒保存的窗口都會(huì)關(guān)掉執(zhí)行前先把手頭的東西存一遍。有些機(jī)器上重啟窗口服務(wù)不夠需要完整重啟一次這個(gè)差異和系統(tǒng)版本、面板類型都有關(guān)系不用糾結(jié)多試一次就行。4. 圖形界面方案BetterDisplay 和 RDM 的用法差異不是所有場景都適合往系統(tǒng)目錄里寫文件。機(jī)器頻繁換屏、或者你只是臨時(shí)想試幾個(gè)分辨率看效果用應(yīng)用層方案更快反過來如果要求原生刷新率和色彩管理不受影響還是得回到覆蓋文件那條路。4.1 BetterDisplay 的安裝與關(guān)鍵開關(guān)這個(gè)工具走的是虛擬顯示器路線不改系統(tǒng)覆蓋文件。安裝用 Homebrew 最省事版本更新也方便。# 通過 cask 安裝首次運(yùn)行需要在系統(tǒng)設(shè)置里授權(quán)屏幕錄制權(quán)限 brew install --cask betterdisplay # 裝完之后確認(rèn)版本順手看看有沒有更新 brew list --cask --versions betterdisplay--cask是必須的它走的是 dmg 分發(fā)而不是源碼編譯。裝完第一次啟動(dòng)系統(tǒng)會(huì)彈權(quán)限請求授予屏幕錄制權(quán)限才能讀到顯示器信息這個(gè)權(quán)限在「隱私與安全性」里可以后續(xù)調(diào)整。打開之后真正要?jiǎng)拥拈_關(guān)只有幾個(gè)。第一個(gè)是「創(chuàng)建虛擬顯示器」打開之后會(huì)多出一塊虛擬屏把它的分辨率設(shè)成你想要的邏輯值然后把真實(shí)屏的畫面鏡像或擴(kuò)展到它上面。第二個(gè)是「HiDPI 分辨率」開關(guān)位置在虛擬屏的詳細(xì)設(shè)置里不開這個(gè)的話切出來的還是普通縮放。第三個(gè)是刷新率4K 屏在虛擬屏模式下有時(shí)會(huì)掉到 30Hz手動(dòng)鎖回 60Hz 就能解決。虛擬屏方案有一個(gè)坑要提前說它多了一層合成截屏和錄屏拿到的是合成后的畫面做像素級(jí)對(duì)比的時(shí)候會(huì)有細(xì)微偏差。這和覆蓋文件方案的原生渲染是兩回事選的時(shí)候心里要有數(shù)。4.2 RDM 的輕量用法與它現(xiàn)在的局限RDM 是很老的一類工具做的事情很簡單——直接往系統(tǒng)里塞分辨率列表比寫 plist 省事。它的定位是輕量裝完就能在菜單欄切換不創(chuàng)建虛擬屏也不改覆蓋文件。# 老版本需要關(guān) SIP 才能寫系統(tǒng)目錄新系統(tǒng)上這條路基本走不通 csrutil status # 下載 dmg 后掛載并拷貝到應(yīng)用目錄這一步只能手動(dòng)做 hdiutil attach ~/Downloads/RDM.app.dmg cp -R /Volumes/RDM/RDM.app /Applications/第一條命令只是確認(rèn)狀態(tài)不涉及修改。第二條的hdiutil attach把 dmg 掛到/Volumes下然后用cp -R拷進(jìn)應(yīng)用目錄。這兩步是標(biāo)準(zhǔn)的掛載安裝流程沒什么特別的。需要提醒的是它的適用范圍。Apple Silicon 機(jī)器上系統(tǒng)卷是簽名的RDM 依賴的寫入路徑改不了功能會(huì)殘缺macOS 14 之后權(quán)限收緊部分分辨率切了也不生效。所以這個(gè)工具我現(xiàn)在只在內(nèi)置屏上做臨時(shí)切換用外接屏還是老實(shí)寫覆蓋文件。4.3 兜底方案手寫 plist 的檢查清單當(dāng)腳本生成的 plist 不生效或者你拿到的是一份別人給的配置就得自己核對(duì)。手寫 plist 最容易錯(cuò)的地方只有四個(gè)按順序查一遍基本能定位。第一scale-resolutions必須寫成array里面每一項(xiàng)是data不能寫成string或者直接塞十六進(jìn)制字符串。第二data里的內(nèi)容必須是合法 base64長度對(duì)應(yīng) 16 字節(jié)的話編碼后是 24 個(gè)字符末尾帶字符數(shù)不對(duì)說明字節(jié)數(shù)錯(cuò)了。第三文件名和目錄名里的 ID 要用小寫十六進(jìn)制和 ioreg 輸出保持一致大小寫敏感。第四plist 頂部的 DOCTYPE 聲明不能少少了之后plutil能過但系統(tǒng)可能不認(rèn)。# 用 defaults 讀一遍剛寫進(jìn)去的文件能讀出來說明結(jié)構(gòu)沒問題 defaults read /Library/Displays/Contents/Resources/Overrides/DisplayVendorID-10ac/DisplayProductID-a0e8 # 轉(zhuǎn)成 xml 格式輸出肉眼核對(duì) scale-resolutions 里的項(xiàng)數(shù)對(duì)不對(duì) plutil -convert xml1 -o - \ /Library/Displays/Contents/Resources/Overrides/DisplayVendorID-10ac/DisplayProductID-a0e8defaults read讀的是解析后的結(jié)果能正常輸出字典就說明文件被系統(tǒng)正確識(shí)別了。plutil -convert xml1 -o -那個(gè)-o -表示輸出到標(biāo)準(zhǔn)輸出不寫回文件純粹用來核對(duì)內(nèi)容不會(huì)破壞原文件。這兩條命令組合起來基本能把「文件寫對(duì)了但沒生效」和「文件本身就有問題」區(qū)分開。5. 避坑與排查五條翻車記錄下面這些是我在實(shí)際部署里真碰到的按現(xiàn)象、原因、解決三段寫能對(duì)號(hào)入座就不用一條條試。5.1 加了檔位卻不出現(xiàn)或者出現(xiàn)后自己跳回去現(xiàn)象一plist 寫進(jìn)去了plutil也過了重啟窗口服務(wù)之后系統(tǒng)設(shè)置里還是原來那兩檔一點(diǎn)變化都沒有。原因絕大多數(shù)是 ID 匹配錯(cuò)了。要么 VendorID 和 ProductID 弄反了要么是從 ioreg 里抄的時(shí)候帶了引號(hào)或者多了空格。還有一種情況是機(jī)器上接了擴(kuò)展塢ioreg 里顯示的是擴(kuò)展塢的 ID不是面板本身的 ID。解決重新跑一遍ioreg -lw0 | grep -i IODisplayPrefsKey把輸出原樣復(fù)制下來逐字符比對(duì)目錄名和文件名。如果用了擴(kuò)展塢把顯示器直接插到機(jī)器上再讀一次兩個(gè)結(jié)果對(duì)比一下就知道哪個(gè)是真實(shí)面板的 ID?,F(xiàn)象二檔位出現(xiàn)了選上去之后畫面正常但過幾秒自己跳回原來的分辨率反復(fù)幾次都這樣。原因生成的分辨率超過了面板能承載的范圍。比如在 1080p 的面板上寫了 3840×2160 的條目系統(tǒng)試了一下發(fā)現(xiàn)帶不動(dòng)就退回。超采樣雖然允許但上限還是受限于面板的物理能力。解決把RESOLUTIONS里的目標(biāo)值降到面板原生分辨率以下或者只保留原生分辨率一半的那一檔作為起點(diǎn)確認(rèn)能穩(wěn)定之后再往上加。4K 面板上從 1920×1080 開始測最穩(wěn)妥。現(xiàn)象三外接屏能出檔位筆記本內(nèi)置屏反而消失了或者兩塊屏只有一個(gè)生效。原因內(nèi)置屏和外接屏的 VendorID 不同如果只建了外接屏的目錄內(nèi)置屏那份沒動(dòng)某些系統(tǒng)版本上會(huì)互相影響。另一種可能是兩份 plist 用了同一個(gè)DisplayProductName菜單合并的時(shí)候出錯(cuò)。解決給兩塊屏分別建目錄內(nèi)置屏用DisplayVendorID-610外接屏用面板自己的 ID文件名各自獨(dú)立。DisplayProductName也寫成不一樣的比如一個(gè)叫Built-in一個(gè)叫External 4K避免混淆。5.2 花屏、喚醒黑屏和系統(tǒng)更新后失效現(xiàn)象四改完之后合蓋睡眠再打開外接屏閃幾下或者直接黑掉要拔插線材才恢復(fù)。原因覆蓋文件里的模式和系統(tǒng)睡眠喚醒時(shí)重新協(xié)商的 EDID 不一致。喚醒過程中系統(tǒng)會(huì)重新枚舉顯示模式如果 plist 里有一個(gè)它認(rèn)不出的條目整個(gè)加載流程可能中斷。解決把 plist 里的分辨率條目精簡到只留確實(shí)會(huì)用的兩三檔并且全部低于面板原生值。改完重啟一次而不是只重啟窗口服務(wù)讓系統(tǒng)完整走一遍枚舉。如果還是不行把scale-resolutions整個(gè)刪掉只保留DisplayProductName看看是不是條目本身的問題?,F(xiàn)象五系統(tǒng)小版本更新之后之前好好的檔位全部消失覆蓋文件還在目錄里但不起作用。原因系統(tǒng)更新會(huì)重置/Library下部分目錄的權(quán)限和屬主文件還在但窗口服務(wù)讀不到。也有可能是新版本更換了覆蓋文件的解析邏輯老的條目格式不再兼容。解決先用ls -la看權(quán)限是不是變回了普通用戶是的話重新執(zhí)行chown root:wheel和chmod 644再重啟窗口服務(wù)。權(quán)限沒問題的話用plutil -convert xml1把文件導(dǎo)出來看一眼結(jié)構(gòu)有沒有被改然后重新生成一份 plist 覆蓋進(jìn)去。我一般會(huì)在每次系統(tǒng)大版本更新之后主動(dòng)重跑一遍這套流程不等它出問題再修。6. 裝完怎么驗(yàn)證三條命令加一條回滾驗(yàn)證這件事不能只看系統(tǒng)設(shè)置里有沒有多出一檔那個(gè)界面會(huì)騙人——有時(shí)候檔位顯示了但選上去沒反應(yīng)有時(shí)候選上去了但實(shí)際渲染還是插值。我習(xí)慣用三條命令交叉確認(rèn)。第一條還是system_profiler SPDisplaysDataType重點(diǎn)看Resolution那一行。真正生效的 HiDPI 會(huì)顯示成類似1920 x 1080 (HiDPI)或者分辨率后面帶Retina字樣只有數(shù)字沒有后綴的多半還是普通縮放。第二條是截屏測實(shí)際渲染尺寸。HiDPI 下邏輯 1920×1080 的屏幕全屏截圖的像素尺寸應(yīng)該是 3840×2160。用screencapture截一張?jiān)儆胹ips讀尺寸。# 截一張全屏圖輸出到臨時(shí)目錄 screencapture -x /tmp/hidpi-check.png # 讀出圖片的實(shí)際像素尺寸和預(yù)期值對(duì)比 sips -g pixelWidth -g pixelHeight /tmp/hidpi-check.png-x表示靜音不播放快門聲。sips那兩個(gè)參數(shù)分別輸出寬和高如果結(jié)果是 3840 和 2160說明系統(tǒng)確實(shí)按兩倍在渲染這是最硬的證據(jù)。如果讀到的是 1920 和 1080那檔位只是個(gè)標(biāo)簽實(shí)際沒生效。第三條是回滾驗(yàn)證也就是確認(rèn)你的備份真的能用。這一步聽著多余但我見過太多人備份了卻不知道怎么還原出問題的時(shí)候照樣抓瞎。# 刪掉自己加的覆蓋目錄恢復(fù)到改之前的狀態(tài) sudo rm -rf /Library/Displays/Contents/Resources/Overrides/DisplayVendorID-10ac # 重啟窗口服務(wù)讓系統(tǒng)重新讀一遍原始配置 sudo killall WindowServer # 和之前的快照對(duì)比確認(rèn)分辨率列表回到了原樣 system_profiler SPDisplaysDataType /tmp/displays-after.txt diff ~/hidpi-backup/*/displays-before.txt /tmp/displays-after.txtrm -rf刪的是整個(gè)目錄因?yàn)槟夸浝镏挥心慵拥哪且环菸募h掉等于完全恢復(fù)。diff那一步如果沒有任何輸出說明恢復(fù)得干干凈凈有輸出的話逐行看通常只是連接狀態(tài)或時(shí)間戳的差異不用緊張。三條都過了這套環(huán)境才算真正跑通。從那以后我每次改覆蓋文件之前都會(huì)先把displays-before.txt存一份并且在改完之后立刻做一次回滾測試——不是因?yàn)椴蛔孕攀且驗(yàn)轱@示配置壞掉的時(shí)候你連菜單都看不清那時(shí)候再找后悔藥就晚了。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取