全屏應用對應的是窗口模式應用,全屏應用指的是整個屏幕都是被咱一個應用獨占了,屏幕上沒有顯示其他的應用,此時的應用就叫全屏應用。如希沃白板這個程序。本文主要告訴大家從微軟官方的文檔以及考古了解到的 Windows 對全屏應用的優化,以及是如何進行的優化,方便小伙伴在撕的時候可以找到根據
當然,很多小伙伴只是需要依據,所以我就先貼出一篇特別好的官方文檔,當然本文大部分內容都是從這篇文檔抄的
- 解密Windows對全屏的優化: Demystifying Fullscreen Optimizations
- Direct3D 9Ex Improvements - Win32 apps
- For best performance, use DXGI flip model
- Windowed, Fullscreen, and Borderless Modes: Which One Is Best?
- fullscreen mode and windowed mode_網絡_安柏霖的專欄-CSDN博客
在開始聊 Windows 對全屏應用的優化之前,需要先聊聊窗口的顯示方式。在 Windows 上運行的應用,如游戲等有三個不同的顯示模式(考古發現還有一些特別的顯示模式,但是太詭異了我就不敢說了)包括 全拼獨占模式(FSE Fullscreen Exclusive)、窗口模式(Windowed)、無邊框窗口。全屏獨占窗口可以讓應用獨占顯示和擁有更多(不是全部占有,但也差不多)的顯卡資源。而在進入窗口模式的應用需要和其他的應用共享顯示和計算資源,其他窗口在后台運行的依然需要使用顯卡計算資源。此時的窗口模式應用需要依靠桌面管理器(DWM Desktop Window Manager)進行調度,此時的顯卡資源也就需要將資源共享給其他所有的應用,而不是和獨占全屏一樣。而第三個模式無邊框模式的窗口,應用依然是窗口運行,但是這個窗口沒有邊框,這意味着窗口可以調整大小用來做全屏,但此時的其他應用依然在后台運行
在微軟的這篇文檔 Demystifying Fullscreen Optimizations 說在 win10 發布之后,微軟進行了全拼窗口優化。但是考古發現其實在 win7 的 dx9 就有這樣的優化,詳細請看 Direct3D 9Ex Improvements - Win32 apps 官方文檔
在微軟官方文檔說 win10 的一個優化是對無邊框窗口進行全屏顯示的應用的優化,對於無邊框的窗口可以讓用戶體驗和全屏獨占應用一樣的方法,但是會比獨占全屏模式更加有利。原因在於獨占全屏模式會出現切換的等待,雖然在大部分設備上有顯卡的優化,這部分的時間非常短,但是如果想要做頻繁的切換,效果也不是很好。而微軟 win10 的優化另一部分就是對提供了更快的應用命令,如 alt+tab 切換窗口和多個屏幕的顯示效果。通過大量的測試微軟對全屏的無邊框窗口的性能優化基本達到了全屏獨占窗口的性能
什么全屏獨占窗口能具有更高的性能?其實在上文有提到的是可以獨占所有的顯示,也就是屏幕的每個像素都是由這個應用控制的,此時的顯卡可以使用更多的計算資源給到這個應用。但是為什么后面又提出了讓無邊框窗口通過修改大小做到全屏?然后花大量的資源優化無邊框全屏窗口的性能。原因在於以下:
- 全屏獨占應用在分辨率切換的時候的處理相對復雜,有大量的應用沒有對這方面進行支持
- 全屏獨占應用的顯卡支持也是需要具體顯卡的
- 如果有需求讓其他的窗口,如游戲工具欄,如 xbox 游戲工具欄覆蓋在全屏獨占窗口時,就需要攔截全屏獨占窗口的渲染。這個攔截會出現比較多性能問題和不穩定問題
- 全屏獨占窗口對於多個屏幕的設備不夠友好,如果使用 DWM 管理另一個屏幕,那么當另一個屏幕的應用獲取焦點又需要如何處理。在 windows 的幾個版本里面的處理是在其他窗口獲取焦點的時候自動最小化全屏獨占窗口,這樣就讓玩全屏獨占應用的小伙伴很難同時一邊玩全屏游戲一邊看電影
- 上文說到的如果是窗口模式,那么渲染此時由 DWM 做的,但是如果有應用進入全屏獨占模式,此時 DWM 需要將顯示交給應用,此時會出現屏幕切換。如果進行頻繁的切換如 alt+tab 那么這個效果比較差
此時小伙伴應該就能了解到為什么微軟對全屏應用的優化將不僅是對全屏獨占應用的優化,還包括對無邊框窗口的全屏顯示優化了。其實無邊框窗口本身也是一個窗口,此時的屏幕依然是 DWM 管理顯示
在 windows xp 開始,在有硬件設備的支持下,微軟能給全屏獨占應用特別好的支持,可以讓幾乎所有的顯卡資源用在了全屏獨占應用,同時停掉后台運行窗口的實際渲染(古老渲染方式的窗口請忽略)而在沒有硬件設備的支持下,微軟也能做到讓計算資源大部分放在全屏獨占應用
在 Windows 10 開始(我記得 win7 dx9 就有這個功能)微軟不僅可以對全屏獨占應用提供性能優化支持,同時對無邊框的全屏窗口提供幾乎同等的性能優化,此時更多的應用都選擇使用無邊框的全屏窗口而不是全屏獨占窗口
但如果是進行更多的性能優化,可以考慮進入全屏獨占窗口
如果是 WPF 程序,那么設置無邊框然后設置窗口大小和屏幕一樣大,也能在 win10 下拿到這部分優化效果。更多關於 WPF 的優化請看 從 DX 層面講 WPF 渲染卡頓
注:有小伙伴對於獨占全屏應用的多屏幕處理覺得有點迷,我換句話告訴大家,請打開一個 UWP 的視頻應用,讓他進入全屏。這個應用進入全屏就是獨占模式,此時你在另一個屏幕移動一個窗口,逐步移動到視頻應用的屏幕上,你可以看到要么視頻的屏幕依然播放視頻,要么就是你移動過去了,視頻應用就最小化了
另外在 win7 下的對無邊框的全屏應用的優化也是有坑的,要求你的應用需要覆蓋屏幕的每一個像素才會隱藏任務欄。在一些有趣的設備上,不會給無邊框的全屏應用設置前台焦點,因為窗口沒有焦點所以此時的任務欄依然可以顯示,解決方法請看 WPF 讓窗口激活作為前台最上層窗口的方法
更多博客