全屏應用對應的是視窗模式應用,全屏應用指的是整個屏幕都是被咱一個應用獨占了,屏幕上沒有顯示其他的應用,此時的應用就叫全屏應用。如希沃白板這個程式。本文主要告訴大家從微軟官方的文檔以及考古瞭解到的 Windows 對全屏應用的優化,以及是如何進行的優化,方便小伙伴在撕的時候可以找到根據 ...
全屏應用對應的是視窗模式應用,全屏應用指的是整個屏幕都是被咱一個應用獨占了,屏幕上沒有顯示其他的應用,此時的應用就叫全屏應用。如希沃白板這個程式。本文主要告訴大家從微軟官方的文檔以及考古瞭解到的 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 讓視窗激活作為前臺最上層視窗的方法
更多博客
Windows桌面實現之七(DirectX HOOK 方式截取特殊的全屏程式之一)