Windows 對全屏應用的優化

来源:https://www.cnblogs.com/lindexi/archive/2020/05/09/12855160.html
-Advertisement-
Play Games

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


全屏應用對應的是視窗模式應用,全屏應用指的是整個屏幕都是被咱一個應用獨占了,屏幕上沒有顯示其他的應用,此時的應用就叫全屏應用。如希沃白板這個程式。本文主要告訴大家從微軟官方的文檔以及考古瞭解到的 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 切換視窗和多個屏幕的顯示效果。通過大量的測試微軟對全屏的無邊框視窗的性能優化基本達到了全屏獨占視窗的性能

什麼全屏獨占視窗能具有更高的性能?其實在上文有提到的是可以獨占所有的顯示,也就是屏幕的每個像素都是由這個應用控制的,此時的顯卡可以使用更多的計算資源給到這個應用。但是為什麼後面又提出了讓無邊框視窗通過修改大小做到全屏?然後花大量的資源優化無邊框全屏視窗的性能。原因在於以下:

  • 全屏獨占應用在解析度切換的時候的處理相對複雜,有大量的應用沒有對這方面進行支持
  • 全屏獨占應用的顯卡支持也是需要具體顯卡的
  • 如果有需求讓其他的視窗,如游戲工具欄,如 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 方式截取特殊的全屏程式之一)


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • using Autofac; using Autofac.Extras.Quartz; using Autofac.Integration.WebApi; using Quartz; using STAr.Enterprise.CRM.JobScheduler.Job; using System.C ...
  • using System.Web.Http; using System.Web.Http.Cors; using System.Net.Http.Headers; namespace WebAPI { public static class WebApiConfig { public static ...
  • public class Utils { #region 對象轉換處理 /// <summary> /// 判斷對象是否為Int32類型的數字 /// </summary> /// <param name="Expression"></param> /// <returns></returns> p ...
  • public class ActiveDirectoryManager { public static DirectoryEntry GetDirectoryEntry() { DirectoryEntry entry = null; try { if (entry == null) { entry ...
  • private static void GetExpression<T2>(Expression expression) { if (expression.NodeType != ExpressionType.Constant) { var _expression = expression as B ...
  • public static class ExpressionHelp { /// <summary> /// Lambda表達式拼接 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="first"></param ...
  • public partial class ModelStatusDictionary<T> where T : new() { static readonly DynamicMethod<T> _dynamicMethod = new DynamicMethod<T>(); /// <summary ...
  • 我覺得我可以加入歷史博物館了,加入微軟歷史博物館,本文也是和大家吹歷史的博客 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...