簡體   English   中英

窗口區域與分層窗口

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM