[英]Window regions vs layered windows
我想為應用程序窗口(邊界半徑和陰影)創建一個自定義的圓形框架從性能的角度來看,最好的技術是什么?
一種。 對於舍入的應用程序窗口使用區域(SetWindowRgn),為陰影使用分層窗口(UpdateLayeredWindow)。
灣 對圓形應用程序窗口和陰影使用分層窗口。
UpdateLayeredWindow的文檔指定:
為了通過分層窗口和任何底層窗口獲得最佳繪圖性能,分層窗口應盡可能小。
我特別要求這個應用程序主窗口,所以一個大窗口可以具有高復雜性,並且大多數時間在屏幕上可見。
我應該使用應用程序窗口的區域或分層窗口嗎? 哪一個在CPU /內存上更輕?
SetWindowRgn
禁用給定Window的DWM。 DWM是負責使用可用圖形硬件以高效方式繪制Window框架的組件。 這應該排除了SetWindowRgn
。 此外, SetWindowRgn
產生非常“古老”的結果,因為抗鋸齒是不可能的。 像素可以是完全透明的或完全不透明的。
為了通過分層窗口和任何底層窗口獲得最佳繪圖性能,分層窗口應盡可能小。
我相信在2018年,這種暗示不那么重要。 該文檔是在18年前編寫的,當時硬件比現在更加有限。
盡管如此, UpdateLayeredWindow
並不是繪制自定義窗口框架的最快方法,尤其是當您必須經常更新位圖時(例如在窗口調整大小期間)。 瓶頸在於這些更新必須從系統內存轉移到圖形內存。 要最小化窗口大小,請創建四個小窗口,這些窗口僅足以繪制窗口的邊框/角落。 例如,Visual Studio會提取此技巧。 使用Spy ++可以看到4個“VisualStudioGlowWindow”實例,這些實例是僅9像素寬/高(在我的系統上)的分層窗口:
如果您希望獲得最佳性能,還可以查看Direct Composition ,並結合WS_EX_NOREDIRECTIONBITMAP
擴展窗口樣式 ,如“ 使用Windows組合引擎進行高性能窗口分層 ”一文中所述。 此技術至少需要Windows 8。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.