微软工程师揭示纯色背景为何会减慢 Windows 7 登录速度

摘要:

多年来,Windows 一直存在一些奇怪的、隐藏的行为,工程师强调了另一个令人着迷的历史例子。早在 2009 年Windows 7 发布前后,用户就开始报告一个令人费解的问题:登录后,欢迎屏幕有时会异常长时间(最长可达 30 秒)才会消失。这种延迟似乎与一个特定的简单设置有关,该设置涉及将纯色设置为桌面背景。

后来,微软的一篇支持文章证实,使用纯色背景的 Windows 7 和 Windows Server 2008 R2 用户也存在此问题。

微软资深人士Raymond Chen工程师兼博客作者“The Old New Thing”作者 Raymond Chen最近解释了登录延迟的技术原因。Chen自 Windows 95 以来就一直使用纯色背景,以节省内存并方便错误报告。据他介绍,Windows 登录过程需要同时加载多个组件,例如任务栏、系统服务、桌面图标和背景。系统会等待所有组件发出准备就绪的信号。只有在所有组件都准备好后,或者等待 30 秒后,欢迎屏幕才会淡出并显示桌面。

陈解释说,延迟30秒的原因是其中一个组件未能发送“就绪”信号。他用一个简化的示例来说明加载壁纸的代码可能是什么样子:

InitializeWallpaper(){
    if (wallpaper bitmap defined)
    {
        LoadWallpaperBitmap();
    }}LoadWallpaperBitmap(){
    locate the bitmap on disk
    load it into memory
    paint it on screen
    Report(WallpaperReady);}

陈指出,关键在于调用Report(WallpaperReady)被放在了LoadWallpaperBitmap函数内部。只有定义了“壁纸位图”时,该函数才会运行。如果你选择了纯色而不是图片,该LoadWallpaperBitmap函数就会被完全跳过,这意味着该Report(WallpaperReady)行代码永远不会被执行。登录系统一直在等待这个信号,但信号始终没有到来,最终在 30 秒超时后才继续显示桌面。

陈指出,如果启用了“隐藏桌面图标”组策略,也可能会出现类似的问题。这是因为报告桌面图标已准备就绪的代码很可能被放在了该策略的条件检查中。

// Original codeInitializeDesktopIcons(){
    bind to the desktop folder
    enumerate the icons
    add them to the screen
    Report(DesktopIconsReady);}// Updated with group policy supportInitializeDesktopIcons(){
    if (desktop icons allowed by policy)
    {
        bind to the desktop folder
        enumerate the icons
        add them to the screen
        Report(DesktopIconsReady);
    }}

如果策略阻止图标显示,则报告调用也会被跳过,导致欢迎屏幕同样出现 30 秒超时。陈强调,重要的是要理解,登录过程本身并不一定需要额外的 30 秒来完成所有任务。欢迎屏幕只是在整个 30 秒超时时间内保持可见,因为某个特定组件未能报告其完成,即使登录的所有其他部分都更早加载完成。

正如微软支持文章指出,2009 年 11 月针对 Windows 7 和 Windows Server 2008 R2 发布了解决此问题的修补程序。

我们在FebBox(https://www.febbox.com/cnbeta) 开通了新的频道,更好阅读体验,更及时更新提醒,欢迎前来阅览和打赏。
查看评论
created by ceallan