全屏应用对应的是窗口模式应用,全屏应用指的是整个屏幕都是被咱一个应用独占了,屏幕上没有显示其他的应用,此时的应用就叫全屏应用。如希沃白板这个程序。本文主要告诉大家从微软官方的文档以及考古了解到的 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. 第144篇:阿里低开项目 init方法

    好家伙,  demo-general项目运行后主界面如下   解析阿里低开引擎中的初始化方法init 拆解项目来自阿里的lowcode engine目录下的 demo general项目 0.找到入口 ...

  2. 记录--整会promise这8个高级用法

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 发现很多人还只会promise常规用法 在js项目中,promise的使用应该是必不可少的,但我发现在同事和面试者中,很多中级或以上的前端 ...

  3. 记录--Vue常问问题整合

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 一.谈谈你对MVVM的理解? 映射关系简化,隐藏controller MVVM在MVC的基础上,把控制层隐藏掉了. Vue不是一个MVVM ...

  4. 记录--iview 使用爬坑

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前段时间公司需要开发一个后台管理系统,时间比较急迫,一两天时间.想一想自己一点一点的搭建起来可能性不太大,就想着有没有现成的可以改一改,就 ...

  5. 【Oracle】手动安装和卸载Oracle,这是最全的一篇了!!

    写在前面 之前写过一篇在CentOS 7/8上安装Oracle的文章,按照我写的文章安装成功了,但是卸载Oracle时出现了问题.今天,我就整理一篇手动安装和卸载Oracle的文章吧.全文为实战型内容 ...

  6. Jetty的bytebufferpool模块

    bytebufferpool模块用于配置Jetty的ByteBuffer对象的对象池. 通过对象池的方式来管理ByteBuffer对象的使用和生命周期,期望降低Jetty进程内存的使用,同时降低JVM ...

  7. OpenHarmony之NAPI框架介绍

      张志成 诚迈科技高级技术专家 NAPI是什么 NAPI的概念源自Nodejs,为了实现javascript脚本与C++库之间的相互调用,Nodejs对V8引擎的api做了一层封装,称为NAPI.可 ...

  8. C# 通过ARP技术来观察目标主机数据包

    由于之前写的C# 实现Arp欺诈的文章属于网络攻击,不能够被展示,所以这边我们稍微说一下C#调用ARP包以及查看其他电脑上网数据包的技术,委婉的说一下ARP在局域网之中的应用. 本文章纯属技术讨论,并 ...

  9. Git 12 IDEA上传本地项目到远程

    这里以上传 Spring 开源项目到 Gitee 为例: 1.点击 Create Git Repository 2.选择项目目录 3.添加到缓存库 4.提交到本地库 5.复制远程库地址 6.推送到远程 ...

  10. 上新啦!KIT!

    上新啦!KIT!近期KIT上新榜单请查收~ 商业推广深度转化事件回传助力用户精细运营,健康数据开放提升运动健康服务体验.手语服务新增非手控部分-- 更多功能请点击 了解更多详情>> 访问华 ...