Windows 窗口樣式 什麼是 WS_EX_NOREDIRECTIONBITMAP 樣式

我以爲我能夠加入歷史博物館了,加入微軟歷史博物館,本文也是和你們吹歷史的博客html

簡單說這個 WS_EX_NOREDIRECTIONBITMAP 樣式是 Win8 提供的,用來作畫面圖層混合的功能。什麼是畫面圖層混合功能?詳細請看爲什麼使用 DirectCompositionwindows

玩法就是系統給你一個繪製表面,你在這個繪製表面上進行繪製,而後 DWM (桌面管理器 DWM Desktop Window Manager) 會拿出你繪製的表面來和其餘的應用進行混合app

用這個方法和傳統的區別是啥?普通的應用是給每一個窗口的客戶區建立一個重定向表面,這個應用的窗口的全部繪製內容都繪製到這個表面。而經過 DirectComposition 可讓應用本身管理和建立這個重定向表面,而讓桌面管理器從應用本身建立的表面進行獲取 Bitmap 和其餘表面進行混合函數

這個方式有什麼做用?主要做用就是提高性能,將 DX 配合上 DirectComposition 是最無敵的性能工具

那麼什麼的軟件會用到這個功能?用到這個功能最多的是 UWP 應用,可是通過考古在 Win8 的全屏應用也用到這個技術,在 win32 函數裏面的 CreateWindowEx 方法建立窗口的時候,能夠經過傳入 WS_EX_NOREDIRECTIONBITMAP 參數,這個參數須要傳入到擴展樣式裏面,根據文檔說的,添加這個樣式以後的應用窗口不呈現到重定向表面。這適用於沒有可見內容的窗口,或者使用表面之外的機制來提供其視覺效果的窗口。詳細文檔請看 Extended Window Styles (Winuser.h) - Win32 appspost

如何才能說德熙不是在騙你?建立一個 UWP 應用,而後運行這個應用。打開 spyxx 工具,找到這個窗口,如我建立的 KurdigalbaHercuqeahear 窗口,右擊屬性就能夠看到窗口樣式性能

對於 UWP 應用的實際窗口應該是 Windows.UI.Core.CoreWindow 窗口,右擊屬性切換到樣式就能夠看到 UWP 的窗口設置的樣式就是 WS_EX_NOREDIRECTIONBITMAP 樣式優化

全部的 UWP 應用都用上了 DirectComposition 技術,此時的 UWP 可以經過 dx 建立多個不一樣的表面,將內容繪製到表面裏面,而後通過 DWM 混合在屏幕顯示orm

這就是 UWP 應用渲染快的一個緣由,如今的應用經過 DX 幾乎壓榨到底了,可是 DX 的渲染不等於屏幕顯示,而渲染的延遲就是用戶交互到屏幕顯示之間。而 DX 到屏幕顯示之間就差一個 DWM 桌面窗口管理器的處理,經過 DirectComposition 或者說 Composition API 技術就能作到壓榨 DWM 的渲染延遲,下降從 DX 到屏幕顯示的時間。固然處理 UWP 以外,使用 WPF 也是能夠作到的,請看 WPF 使用 Composition API 作高性能渲染視頻

固然這須要來聊下 DWM 是怎麼工做的,從大佬的 Windows with C++ - High-Performance Window Layering Using the Windows Composition Engine 能夠了解到,在 Vista 引入的桌面窗口管理器是這樣作的,將每一個窗口渲染到屏幕外的表面或緩衝區,也就是上文說的普通應用的重定向表面。系統爲每一個頂級窗口分配一個這樣的表面,而且全部GDI,Direct3D以及Direct2D圖形都呈現到這些表面。那爲何這個表面叫重定向表面緣由是GDI繪圖命令甚至Direct3D交換鏈表示請求都被重定向或經過複製(在GPU內作的)重定向表面

而經過 DirectComposition 則是由軟件本身實現管理和建立表面,經過 DWM 調度的是圖層合併。對應用來講有更可控和更多的優化空間,能夠壓榨 DWM 部分的性能。對 DWM 來講,能夠經過合成圖層的方法方便進行窗口特效處理,如亞克力效果。對其餘應用來講,能夠經過重定向表面技術,獲取其餘應用的截圖,這對於視頻直播軟件來講能提高不少性能。關於應用截圖請看 win10 uwp 錄製任意應用屏幕

本文只是和小夥伴吹這個技術,不會告訴你們實際上應該如何作。每一個微軟添加的 API 大部分都是有歷史緣由的,爲何添加這個 API 解決什麼問題,大概都是遇到某個問題,可是正經解決方案解決不了,由於有歷史緣由,因此換了一個咱看起來很詭異的方法解決

Extended Window Styles (Winuser.h) - Win32 apps

Windows with C++ - High-Performance Window Layering Using the Windows Composition Engine

相關文章
相關標籤/搜索