微軟工程師揭示純色背景為何會減慢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秒的原因是其中一個組件未能發送「就緒」訊號。他用一個簡化的範例來說明載入桌布的程式碼可能會是什麼樣子:
初始化壁紙(){ if(壁紙位圖已定義) { 載入壁紙位圖(); }}載入壁紙位圖(){ 定位磁碟上的點陣圖 將其載入到記憶體中 在螢幕上繪製 報告(WallpaperReady);}
陳指出,關鍵在於呼叫Report(WallpaperReady)被放在了LoadWallpaperBitmap函數內部。只有定義了「壁紙位圖」時,函數才會運作。如果你選擇了純色而不是圖片,那麼該LoadWallpaperBitmap函數就會被完全跳過,這表示該Report(WallpaperReady)行程式碼永遠不會被執行。登入系統一直在等待這個訊號,但訊號始終沒有到來,最終在30 秒逾時後才繼續顯示桌面。
陳指出,如果啟用了「隱藏桌面圖示」群組策略,也可能會出現類似的問題。這是因為報告桌面圖示已準備就緒的程式碼很可能被放在了該策略的條件檢查中。
// 原始碼InitializeDesktopIcons(){ 綁定到桌面資料夾 枚舉圖示 將它們添加到螢幕 報告(DesktopIconsReady);}// 使用群組原則支援更新InitializeDesktopIcons(){ if(策略允許的桌面圖示) { 綁定到桌面資料夾 枚舉圖示 將它們添加到螢幕 報告(桌面圖示就緒); }}
如果策略阻止圖示顯示,則報告呼叫也會被跳過,導致歡迎畫面同樣出現30 秒逾時。陳強調,重要的是要理解,登入過程本身並不一定需要額外的30 秒來完成所有任務。歡迎畫面只是在整個30 秒超時時間內保持可見,因為某個特定元件未能報告其完成,即使登入的所有其他部分都更早加載完成。
正如微軟支援文章指出,2009 年11 月針對Windows 7 和Windows Server 2008 R2 發布了解決此問題的修補程式。