全屏应用对应的是窗口模式应用,全屏应用指的是整个屏幕都是被咱一个应用独占了,屏幕上没有显示其他的应用,此时的应用就叫全屏应用。如希沃白板这个程序。本文主要告诉大家从微软官方的文档以及考古了解到的 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 方式截取特殊的全屏程序之一)

Windows 对全屏应用的优化的更多相关文章

  1. Unity3D在Windows的全屏和跨屏(双屏)方案

    方案1 unity中2个摄像机场景显示在两个显示器屏幕上(一个窗口跨屏) 1.设置场景中的两个摄像机 摄像机1 摄像机2 2.设置发布的平台及分辨率 3.全屏运行游戏,没有标题栏还可以通过-popup ...

  2. 背水一战 Windows 10 (3) - UI: 窗口全屏, 窗口尺寸

    [源码下载] 背水一战 Windows 10 (3) - UI: 窗口全屏, 窗口尺寸 作者:webabcd 介绍背水一战 Windows 10 之 UI 窗口全屏 窗口尺寸 示例1.窗口全屏UI/F ...

  3. Windows中检测当前是否有窗口全屏

    不时看到有人问起如何判断当前是否有窗口正处于全屏状态? 不过, 在解决这个问题之前先来解决一个简单的问题?         什么是全屏?     相当一部分人认为: 窗口如果是最大化的, 那么它就是最 ...

  4. Windows 7 下玩游戏不能全屏

    问题描述:许多用户反映,在 Windows 7 环境下,全屏游戏时两边屏幕都是黑的,只好窗口运行了.其实这是正常现象:有些游戏本身并没有提供宽屏分辨率支持.其图形界面都是按照一定比例(如 4:3)来设 ...

  5. Windows 7 蓝屏代码大全 & 蓝屏全攻略

    关于Windows 7.Vista等系统的蓝屏,之前软媒在Win7之家和Vista之家都有很多文章讨论过,但是都是筛选的常见的一些问题,今天这个文章是个大全,希望大家看着别头痛,文章收藏下来以后待查即 ...

  6. Windows 7 蓝屏代码大全 & 蓝屏全攻略

    关于Windows 7.Vista等系统的蓝屏.之前软媒在Win7之家和Vista之家都有非常多文章讨论过,可是都是筛选的常见的一些问题,今天这个文章是个大全.希望大家看着别头痛.文章收藏下来以后待查 ...

  7. H5项目常见问题及注意事项,视频全屏,定位,屏幕旋转和触摸,偏页面重构向 来源joacycode的github

    Meta基础知识: H5页面窗口自动调整到设备宽度,并禁止用户缩放页面 //一.HTML页面结构 <meta name="viewport" content="wi ...

  8. Blazor组件提交全记录: FullScreen 全屏按钮/全屏服务 (BootstrapBlazor - Bootstrap 风格的 Blazor UI 组件库)

    Blazor 简介 Blazor 是一个使用 .NET 生成的交互式客户端 Web UI 的框架.和前端同学所熟知的 Vue.React.Angular 有巨大差异. 其最大的特色是使用 C# 代码( ...

  9. fullpage.js全屏滚动插件使用小结

    刚做好公司网站,通过全屏滚动,显著提高了官网的浏览体验.遂总结一下使用fullpage.js的方法.欢迎指正 一. fullpage.js简介 fullpage.js是一套实现浏览器全屏滚动的js插件 ...

  10. 原生JS实现全屏切换以及导航栏滑动隐藏及显示——重构前

    思路分析: 向后滚动鼠标滚轮,页面向下全屏切换:向前滚动滚轮,页面向上全屏切换.切换过程为动画效果. 第一屏时,导航栏固定在页面顶部,切换到第二屏时,导航条向左滑动隐藏.切换回第一屏时,导航栏向右滑动 ...

随机推荐

  1. Cesium之原生控件

    1. 控件概述 Cesium的开始,基本上是从new一个Viewer开始 // ... <div id="cesiumContainer"></div> & ...

  2. 记录--手写vm.$mount方法

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 一.概述 在我们开发中,经常要用到Vue.extend创建出Vue的子类来构造函数,通过new 得到子类的实例,然后通过$mount挂载到 ...

  3. elasticsearch聚合桶排序、分页实战

    很多时候业务上需要分组排序分页的场景,类似于mysql的group by xxx limit 0 10.so,当数据同步到es后,相同的需求场景也出现了.背景:商品根据商品销量排序,销量数据是以sku ...

  4. Oracle通过数据库链连接KingbaseES

    测试环境: ip 数据库版本 192.168.254.135 oracle 11g 192.168.254.137 V008R006C005B0023 通过oracle官网得知,Oracle使用DG4 ...

  5. Java中split的用法及一个金典入坑题目

    split() 方法根据匹配给定的正则表达式来拆分字符串. 注意: . . $. | 和 * 等转义字符,必须得加 \\. 注意:多个分隔符,可以用 | 作为连字符. 语法 public String ...

  6. centos环境minio安装踩坑指南2023年7月30日

    MinIO的安装踩坑指南 环境centos7 1. 安装MinIO官方文档 Binary下载 , 按照官网的路径配置比较快 下载minio wget https://dl.min.io/server/ ...

  7. 1、android Studio 打Jar包

    1.创建一个AndroidStudio 工程 注意下面这个Package Name 2.进入Android Studio工程中 选择Project Flies 选项 然后找到 app->src- ...

  8. 【中秋国庆不断更】HarmonyOS对通知类消息的管理与发布通知(下)

    [中秋国庆不断更]HarmonyOS对通知类消息的管理与发布通知(下) 一.发布进度条类型通知 进度条通知也是常见的通知类型,主要应用于文件下载.事务处理进度显示.HarmonyOS提供了进度条模板, ...

  9. mysql 重新整理——sql 执行语句的顺序[五]

    前言 盗图: 其实在复杂的语句中,需要我们逐步去分析,然后呢,我们了解一些优化器到底是如何帮我们优化的,就知道到底是mysql怎么执行代码. 我把以前的丢了,后续补全.

  10. MVC 下拉选项实现的几种方式

    主要介绍4种方式 硬编码方式: ViewBag.hard_value = new List<SelectListItem>() { new SelectListItem(){Value=& ...