Apa*_*che 5 performance gui windows-10
重现:标题有点神秘,所以要看看我的问题是什么样的,请运行“Furmark”或“BOINC”(gpu 加速),然后开始打开 Windows。一切都变慢了,窗户部分绘制得很慢,等等。
问题是:什么会导致窗口/元素绘制速度变慢,如何跟踪和解决这个问题?
什么时候发生:当我同时处理多项任务时。当我启动PC时,它很活泼。即使我给它加了负荷,它也不会变慢。只有当我开始处理一个有 3-4 种负载打开的项目时。
硬件:
操作系统: Windows 10 - 10.0.16299 内部版本 16299
我想也许是 Chrome 和 Vivaldi(以及其他 Chrome/Blink 引擎应用程序)填满了 VRAM,然后导致速度变慢,但正如我所说,任务管理器没有任何证据就回来了。发生这种情况时,游戏也能正常运行,因此不会出现明显的 3D 性能损失。
我的笔记本电脑上也有同样的问题。我总是同时处理多项任务,而且我有一台功能比较强大的笔记本电脑。我所做的最新基准测试显示,这台机器领先于大多数售价 300-400 欧元、内存少得多的廉价笔记本电脑。
事实上,令我惊讶的是,在“冷启动”时,计算机会有点快。但是我处理的多任务越多(通常同时打开 6-7 个程序,因为我有监控程序和自动化程序),它就会变得异常缓慢和不稳定。
当您执行多任务时,打开窗口非常慢。在 Chrome 中打开新选项卡很慢,在窗口之间切换又慢又不稳定。如果感觉 CPU 降频至 800 Mhz,使用电池供电,除一个内核外的所有内核都关闭。
但是,有趣的是,基准测试结果还不错,而且基准测试没有显示任何 CPU 或 GPU 降频的迹象。任务管理器没有显示CPU使用率或磁盘使用率高,内存消耗可能很高,但即使关闭大多数程序后,PC仍然会很慢。
我觉得 Windows 中存在一个错误(或者非常糟糕的编程算法),就好像屏幕上显示的 GUI 对象越多,Windows 算法就非常糟糕/未经优化,以至于它在 GUI 对象数量疯狂高的情况下滞后。
我做了一些研究,了解屏幕上对象数量的负载的最佳方法是进入任务管理器并显示一个名为“GDI 对象”的特殊列。在一个没有这个问题的用户帐户上,3200 GDI objects总共有这个问题。在我遇到此问题的另一个用户帐户上,8400 GDI objects总共有。遗憾的是,任务管理器中并未将其链接到 CPU 或 GPU 负载。CPU 可以完全空闲,但计算机会滞后。
更新这篇文章最初写于 2017 年。2023年,我仍然遇到同样的问题,所以我做了更多的研究。我的结论是,这是由于 GDI 对象泄漏和 GDI 对象过剩共同造成的。Windows 中的每个用户会话都获得最大数量的 GDI 对象。这些会话就像虚拟化的,或者即使不是虚拟化的,它们也是有限的。无论背后的真正原因是什么,当用户空间达到 10000 个 GDI 对象(默认情况下)时,它就会开始节流,这是图形对象的一种“速率限制”,因此尽管 CPU/GPU/Ram 负载很慢,但会出现图形故障。美好的。3D 游戏(具体而言,不是 2D 游戏)很特殊,因此即使达到此限制,3D 游戏也会全速运行。这将主要影响桌面性能。有一些 regedit 键可以增加这个值:GDIProcessHandleQuota就是一个例子。但请注意,这些键有时会在每个主要操作系统版本中发生变化。从 Windows 10(已确认)和可能的 Windows 11 开始,这些密钥是有效的。
GDIProcessHandleQuota. 这个假设解释了为什么创建新的用户会话、重新启动或监视 GDI 对象的数量有效。删除 CFG(和同级)也是有效的,因为它可以在某种程度上减少大量使用时的系统负载,使系统即使在“速率限制”下仍然感觉很快。关键是:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows USERProcessHandleQuota GDIProcessHandleQuota USERNestedWindowLimit
相同的键:
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows NT\CurrentVersion\Windows
然后更改键:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\内存管理 SessionPoolSize SessionViewSize
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\SubSystems Windows,增加“SharedSection”中间值
GDIView.exe /scomma %temp%\data.txt
set a=0
for /f "tokens=17 delims=," %i in ('type %temp%\data.txt') do set /a a+=%i
echo %a%
Run Code Online (Sandbox Code Playgroud)
禁用 CFG。显然,我禁用了CFG。这给我带来了小小的性能提升,但问题仍然存在。
创建一个新的用户帐户。到目前为止,这是非常有效的。当有很多对象要显示时,Windows GUI 显示代码部分似乎会严重不堪重负,但这适用于每个用户会话。如果您创建一个新的用户会话,并使用一个会话来执行繁重的任务(繁重的自动化、多个 Firefox/Edge/Vivaldi/Chrome 选项卡),使用一个会话来执行轻量任务,那么问题就完全解决了。
PS:像Windows XP这样的旧操作系统在Windows 10/11的范围内似乎没有这个问题。这似乎与微软在 Windows 10/11 中实现 GDI/DirectDraw 的方式有关。也可能是 Windows XP 的图形密集型桌面要少得多,因此在执行密集型桌面任务时性能更好。
Windows 10 Fall Creators 更新默认为所有应用程序启用控制流防护 (CFG)。禁用此 CFG 力也可以提高性能。为此,请打开Windows Defender 安全中心,现在选择应用程序和浏览器控制,然后单击漏洞利用保护设置
现在将 CFG 的值设置为 Off by Default
现在重新启动,Windows 10 应该会更快。
| 归档时间: |
|
| 查看次数: |
5065 次 |
| 最近记录: |