由于微软转向 Chromium,用户现在可以在 Google Chrome 和 Microsoft Edge 中享受增强的功能。此次整合带来了重大改进,包括更流畅的滚动、优化的字体处理和更好的电池效率(专门针对 Windows 11)。现在,微软正将注意力转向改进桌面窗口管理器 (DWM.exe) 的暗模式功能。
然而,一个常见问题仍然存在:在 Windows 10 或 Windows 11 上使用暗色模式的 Chrome 时,用户在打开新窗口时经常会遇到短暂的白色闪烁。这种不良现象凸显了一个问题,即浏览器和操作系统都不知道如何正确管理初始渲染,从而导致中间屏幕难看。
在操作系统的暗色主题设置下启动 Chrome 和 Edge 时,这一点同样显而易见。虽然谷歌和微软之前都已经解决了暗色主题集成的问题,但在浏览器窗口之间的转换过程中,这一挑战仍然尤为明显。之前在 Windows 文件资源管理器中也发现了类似的闪存问题,但这些问题已在 Windows 11 23H2 更新中得到解决。
解决 Chromium 暗黑模式中的白色闪烁问题
根据Windows Latest 分析的最近 Chromium 代码提交,问题似乎源于 Windows 缺乏对新创建的 Chrome 窗口的必要处理。启动新窗口时,Windows 11 默认使用白色背景,直到 Chrome 或 Edge 取得控制权后才会消失。
在此背景下,当 Windows 11 以暗黑模式运行时,新窗口显示的管理会出现问题,Windows 首先处理加载阶段,直到各个应用程序建立渲染。遗憾的是,目前 Windows 无法有效地识别暗黑主题管理。
微软开发人员 Chris Davis 介绍了一种通过实施隐形技术来缓解白光闪烁的变通方法。这涉及隐藏窗口,直到 Chrome 或 Edge 能够呈现合适的深色背景。虽然这更像是一个补丁,而不是 DWM.exe 问题的最终解决方案,但它似乎是目前最可行的解决方案。
正如 Chris Davis 所解释的那样,“首次创建窗口时,DWM 将使用默认的白色背景颜色。这可能会导致在暗模式下首次显示窗口时出现白色闪烁。为了避免这种情况,我们在首次显示窗口之前将其遮蔽,并在取消遮蔽之前强制绘制所需的背景颜色。”
对 Chromium 提交的进一步研究表明了对 的修改ui/views/win/hwnd_message_handler.cc
。
在隐藏状态下,代码使用 GDI 调用以深色填充客户端区域。达到所需的深色色调后,Microsoft 设置DWMWA_CLOAK
为FALSE
,以预期的深色视觉效果而不是突然的白色闪光揭开窗口。
虽然一些贡献者对潜在的竞争条件表示担忧——当窗口更新为深色背景时,GPU 可能会渲染页面内容——但微软的测试并未发现此类问题,这表明补丁部署后过渡会很顺利。
展望未来,谷歌和微软可能会改进 Chromium 管理顶层窗口的方式。未来的解决方案可能会看到实现类似WS_EX_NOREDIRECTIONBITMAP
或更新的 Windows API(例如DWM_SYSTEMBACKDROP_TYPE
)的方法,以完全防止白色闪烁。
不过,目前将采用戴维斯介绍的隐形方法,消除 Windows 10 和 Windows 11 上的白色闪光效果。预计这些改进将很快向 Chrome 和 Edge 用户推出。
更多见解
1. Chrome 和 Edge 出现白闪问题的原因是什么?
出现白色闪烁问题的原因是 Windows 每次创建新窗口时都默认使用白色背景,这与浏览器的暗黑模式主题设置形成对比。
2. 微软提出的隐藏方法有何含义?
隐形方法是一种临时解决方法,它会隐藏窗口,直到深色背景可以正常显示。这可以防止窗口转换期间出现白色闪光。
3. 未来的更新是否会完全消除白色闪光?
虽然当前的隐形方法解决了白光闪光问题,但未来的更新可能会探索 Chromium 和 Windows 中更多集成的解决方案,以最终更有效地解决潜在问题。
发表回复