我在 Windows 10 和 11 上使用 Chromium 时遇到了一些非常非常奇怪的问题。我尝试了两种不同的基于 Chromium 的浏览器(Chrome 和 Brave),它们都出现了同样的问题。
我的配置如下:1 台 4K 显示器、1 台 1440p 显示器、1 台 1080p 显示器、Ryzen 3900X、RTX 3070 和 32GB RAM。所有显示器在 Windows 中均设置为 100% DPI,并以原始分辨率运行,并采用最新的 Nvidia 驱动程序。
当浏览器在我的 1080p 显示器上最大化并播放动画时,例如 Facebook 的“有人正在输入评论”或只是常规 CSS 动画,4K 和 1440p 显示器上的视频播放开始完全滞后,导致视频在某个时刻卡住(无限缓冲)。当我切换标签或 1080p 显示器上的动画停止时,视频会再次开始播放。
我最初在 Windows 10 中遇到了这个问题,但我决定彻底清除我的 SSD 并安装 Windows 11。我安装了 Brave 并决定不从 Chrome 导入任何设置,因此这是一个完美的默认安装。然而,同样的问题还是发生了。
如果我关闭 chrome://flags 中的硬件加速并重新启动浏览器,它就可以完美运行。视频播放正常,尽管 YouTube 上的 4K 60 FPS 有时有点不连贯。如果我不最大化浏览器,它只是在窗口中运行,它也可以完美运行。
此时,我怀疑有几件事可能是错的:
- Chromium(不太可能,因为据我所知没有其他人报告过此问题)
- 硬件(CPU、GPU、主板)
我可以排除有问题的驱动程序,因为我重新安装了 Windows,并尝试了几个不同的 Nvidia 驱动程序。我认为实际硬件不太可能,因为我只在使用 Chromium 时遇到问题。
以下是我尝试过的一些方法:
- 不同的 HDMI 电缆
- GPU 上的不同端口
- 将显示器换成另一台 1080p 显示器
- 重新安装 Windows
- 更改所有显示器的分辨率、刷新率等
为了复制该问题,我只需在我的 1080p 显示器上打开此页面(使用 CSS 动画旋转的正方形),然后在另一台显示器上播放任何 YouTube 视频:https://codepen.io/teerapuch/pen/vLJXeR
要查看使用我的手机录制的示例(只是为了排除任何 PC 问题),请访问以下链接:https://www.youtube.com/watch?v=ufsDsV6_HCg
播放动画时,视频播放停止。当我切换到此帖子的选项卡(其中没有动画)时,它会恢复视频播放。
我该从哪里开始调试此行为?事件查看器或我查看过的其他任何地方都没有错误。
答案1
所以这整个问题都是显示器的问题。我仍然不知道原因,也无法解释原因,但现在已经修复了。
我扔掉了旧的 1080p 显示器,买了一个全新的 2560x1440 显示器来替换它。现在一切都运行顺利。
如果有人碰巧遇到这个问题,我为自己制作了一个用户脚本(TamperMonkey),基本上可以禁用浏览器中的所有 CSS 动画。它每隔 1 秒检查是否有任何新动画,然后将其杀死。有些页面看起来很怪异,但与我遇到的延迟相比,这是一个很好的权衡。
// ==UserScript==
// @name Disable all animations
// @version 1.0
// @author mortenmoulder
// @include *
// @grant GM_addStyle
// @grant GM_addElement
// ==/UserScript==
//remove animations globally
GM_addStyle("* { animation-duration: 0s !important; animation-play-state: paused; }");
var ignoreElements = [];
//remove animations inside shadow DOM elements
function findShadowRoots(elements) {
for (var i = 0; i < elements.length; i++) {
if(elements[i].shadowRoot) {
if(ignoreElements.includes(elements[i].shadowRoot) == false) {
GM_addElement(elements[i].shadowRoot, 'style', { textContent: '* { animation-duration: 0s !important; animation-play-state: paused;' });
ignoreElements.push(elements[i].shadowRoot);
}
findShadowRoots(elements[i].shadowRoot.querySelectorAll("*"));
}
}
}
//remove animations every 1 second
setInterval(() => {
var allNodes = document.querySelectorAll('*');
findShadowRoots(allNodes);
}, 1000);