Windows 對全屏應用的優化

全屏應用對應的是窗口模式應用,全屏應用指的是整個屏幕都是被咱一個應用獨佔了,屏幕上沒有顯示其餘的應用,此時的應用就叫全屏應用。如希沃白板這個程序。本文主要告訴你們從微軟官方的文檔以及考古瞭解到的 Windows 對全屏應用的優化,以及是如何進行的優化,方便小夥伴在撕的時候能夠找到根據html

固然,不少小夥伴只是須要依據,因此我就先貼出一篇特別好的官方文檔,固然本文大部份內容都是從這篇文檔抄的windows

在開始聊 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 切換窗口和多個屏幕的顯示效果。經過大量的測試微軟對全屏的無邊框窗口的性能優化基本達到了全屏獨佔窗口的性能app

什麼全屏獨佔窗口能具備更高的性能?其實在上文有提到的是能夠獨佔全部的顯示,也就是屏幕的每一個像素都是由這個應用控制的,此時的顯卡能夠使用更多的計算資源給到這個應用。可是爲何後面又提出了讓無邊框窗口經過修改大小作到全屏?而後花大量的資源優化無邊框全屏窗口的性能。緣由在於如下:less

  • 全屏獨佔應用在分辨率切換的時候的處理相對複雜,有大量的應用沒有對這方面進行支持
  • 全屏獨佔應用的顯卡支持也是須要具體顯卡的
  • 若是有需求讓其餘的窗口,如遊戲工具欄,如 xbox 遊戲工具欄覆蓋在全屏獨佔窗口時,就須要攔截全屏獨佔窗口的渲染。這個攔截會出現比較多性能問題和不穩定問題
  • 全屏獨佔窗口對於多個屏幕的設備不夠友好,若是使用 DWM 管理另外一個屏幕,那麼當另外一個屏幕的應用獲取焦點又須要如何處理。在 windows 的幾個版本里面的處理是在其餘窗口獲取焦點的時候自動最小化全屏獨佔窗口,這樣就讓玩全屏獨佔應用的小夥伴很難同時一邊玩全屏遊戲一邊看電影
  • 上文說到的若是是窗口模式,那麼渲染此時由 DWM 作的,可是若是有應用進入全屏獨佔模式,此時 DWM 須要將顯示交給應用,此時會出現屏幕切換。若是進行頻繁的切換如 alt+tab 那麼這個效果比較差

此時小夥伴應該就能瞭解到爲何微軟對全屏應用的優化將不只是對全屏獨佔應用的優化,還包括對無邊框窗口的全屏顯示優化了。其實無邊框窗口自己也是一個窗口,此時的屏幕依然是 DWM 管理顯示工具

在 windows xp 開始,在有硬件設備的支持下,微軟能給全屏獨佔應用特別好的支持,可讓幾乎全部的顯卡資源用在了全屏獨佔應用,同時停掉後臺運行窗口的實際渲染(古老渲染方式的窗口請忽略)而在沒有硬件設備的支持下,微軟也能作到讓計算資源大部分放在全屏獨佔應用post

在 Windows 10 開始(我記得 win7 dx9 就有這個功能)微軟不只能夠對全屏獨佔應用提供性能優化支持,同時對無邊框的全屏窗口提供幾乎同等的性能優化,此時更多的應用都選擇使用無邊框的全屏窗口而不是全屏獨佔窗口性能

但若是是進行更多的性能優化,能夠考慮進入全屏獨佔窗口測試

若是是 WPF 程序,那麼設置無邊框而後設置窗口大小和屏幕同樣大,也能在 win10 下拿到這部分優化效果。更多關於 WPF 的優化請看 從 DX 層面講 WPF 渲染卡頓

注:有小夥伴對於獨佔全屏應用的多屏幕處理以爲有點迷,我換句話告訴你們,請打開一個 UWP 的視頻應用,讓他進入全屏。這個應用進入全屏就是獨佔模式,此時你在另外一個屏幕移動一個窗口,逐步移動到視頻應用的屏幕上,你能夠看到要麼視頻的屏幕依然播放視頻,要麼就是你移動過去了,視頻應用就最小化了

另外在 win7 下的對無邊框的全屏應用的優化也是有坑的,要求你的應用須要覆蓋屏幕的每個像素纔會隱藏任務欄。在一些有趣的設備上,不會給無邊框的全屏應用設置前臺焦點,由於窗口沒有焦點因此此時的任務欄依然能夠顯示,解決方法請看 WPF 讓窗口激活做爲前臺最上層窗口的方法

更多博客

Windows桌面實現之七(DirectX HOOK 方式截取特殊的全屏程序之一)

相關文章
相關標籤/搜索