休眠之后,外接显示器亮度被重置

你把显示器调暗,合上盖子,回来一看又是亮的。或者你改了分辨率、拔插了线,同样的事情发生。系统设置里没有任何地方能把它设回去——因为系统自己也没有保存这个值。

到底发生了什么

在第三方显示器上,亮度与对比度存在显示器内部,通过 DDC/CI 访问;如果这块面板没有实现 DDC/CI,那么唯一还能控制的就是 CoreGraphics 伽马表。无论哪条路,macOS 都不会保存这个值。从休眠唤醒、改分辨率、重新插拔,都意味着显示器被重新配置,你设过的东西就这么没了——面板回到它自己的默认状态。

为什么想当然的修法没用

最自然的修法是:监听唤醒通知,然后把值写回去。这会失败,原因很具体——面板在唤醒之后需要一点时间才会回应 DDC/CI。你在通知到达的瞬间就写,这次写入会被直接丢掉。这就是为什么很多自己写的小脚本「有时候灵、有时候不灵」。

可靠的做法是:等一等(我们等 2.5 秒),再写;如果没写进去,就重试。我们的重试节奏是 1 秒、2 秒、4 秒。而且第一次尝试时面板可能根本还没出现在总线上——这不是错误,这是正常的先后顺序。

这不是推测:它是我们源码里 SelfHealEngine.wakeDelay 上的注释,也是这个功能存在的原因。

今天就能用的办法

如果亮度完全回不来

那是另一个故障——可能是面板没有实现 DDC/CI,也可能是线材或接口不传它。区分办法在《DDC/CI 无响应》里。

相关

DDC/CI 无响应:区分显示器、线材与接口 · 该用哪个 Mac 显示器工具?一份诚实对比 · 自己验证我们的说法

调暗之后画面发灰?

文字发虚?先看你用的是哪种模式