我觉得我可以加入历史博物馆了,加入微软历史博物馆,本文也是和大家吹历史的博客

简单说这个 WS_EX_NOREDIRECTIONBITMAP 样式是 Win8 提供的,用来做画面图层混合的功能。什么是画面图层混合功能?详细请看为何使用 DirectComposition

玩法就是系统给你一个绘制表面,你在这个绘制表面上进行绘制,然后 DWM (桌面管理器 DWM Desktop Window Manager) 会拿出你绘制的表面来和其他的应用进行混合

用这个方法和传统的区别是啥?普通的应用是给每个窗口的客户区创建一个重定向表面,这个应用的窗口的所有绘制内容都绘制到这个表面。而通过 DirectComposition 可以让应用自己管理和创建这个重定向表面,而让桌面管理器从应用自己创建的表面进行获取 Bitmap 和其他表面进行混合

这个方式有什么作用?主要作用就是提升性能,将 DX 配合上 DirectComposition 是最无敌的性能

那么什么的软件会用到这个功能?用到这个功能最多的是 UWP 应用,但是经过考古在 Win8 的全屏应用也用到这个技术,在 win32 函数里面的 CreateWindowEx 方法创建窗口的时候,可以通过传入 WS_EX_NOREDIRECTIONBITMAP 参数,这个参数需要传入到扩展样式里面,根据文档说的,添加这个样式之后的应用窗口不呈现到重定向表面。这适用于没有可见内容的窗口,或者使用表面以外的机制来提供其视觉效果的窗口。详细文档请看 Extended Window Styles (Winuser.h) - Win32 apps

如何才能说德熙不是在骗你?创建一个 UWP 应用,然后运行这个应用。打开 spyxx 工具,找到这个窗口,如我创建的 KurdigalbaHercuqeahear 窗口,右击属性就可以看到窗口样式

对于 UWP 应用的实际窗口应该是 Windows.UI.Core.CoreWindow 窗口,右击属性切换到样式就可以看到 UWP 的窗口设置的样式就是 WS_EX_NOREDIRECTIONBITMAP 样式

所有的 UWP 应用都用上了 DirectComposition 技术,此时的 UWP 能够通过 dx 创建多个不同的表面,将内容绘制到表面里面,然后经过 DWM 混合在屏幕显示

这就是 UWP 应用渲染快的一个原因,现在的应用通过 DX 几乎压榨到底了,但是 DX 的渲染不等于屏幕显示,而渲染的延迟就是用户交互到屏幕显示之间。而 DX 到屏幕显示之间就差一个 DWM 桌面窗口管理器的处理,通过 DirectComposition 或者说 Composition API 技术就能做到压榨 DWM 的渲染延迟,降低从 DX 到屏幕显示的时间。当然处理 UWP 之外,使用 WPF 也是可以做到的,请看 WPF 使用 Composition API 做高性能渲染

当然这需要来聊下 DWM 是怎么工作的,从大佬的 Windows with C++ - High-Performance Window Layering Using the Windows Composition Engine 可以了解到,在 Vista 引入的桌面窗口管理器是这样做的,将每个窗口渲染到屏幕外的表面或缓冲区,也就是上文说的普通应用的重定向表面。系统为每个顶级窗口分配一个这样的表面,并且所有GDI,Direct3D以及Direct2D图形都呈现到这些表面。那为什么这个表面叫重定向表面原因是GDI绘图命令甚至Direct3D交换链表示请求都被重定向或通过复制(在GPU内做的)重定向表面

而通过 DirectComposition 则是由软件自己实现管理和创建表面,通过 DWM 调度的是图层合并。对应用来说有更可控和更多的优化空间,可以压榨 DWM 部分的性能。对 DWM 来说,可以通过合成图层的方法方便进行窗口特效处理,如亚克力效果。对其他应用来说,可以通过重定向表面技术,获取其他应用的截图,这对于视频直播软件来说能提升很多性能。关于应用截图请看 win10 uwp 录制任意应用屏幕

本文只是和小伙伴吹这个技术,不会告诉大家实际上应该如何做。每个微软添加的 API 大部分都是有历史原因的,为什么添加这个 API 解决什么问题,大概都是遇到某个问题,但是正经解决方案解决不了,因为有历史原因,所以换了一个咱看起来很诡异的方法解决

Extended Window Styles (Winuser.h) - Win32 apps

Windows with C++ - High-Performance Window Layering Using the Windows Composition Engine

Windows 窗口样式 什么是 WS_EX_NOREDIRECTIONBITMAP 样式的更多相关文章

  1. C语言Windows程序开发—Windows窗口样式与常用控件样式【第04天】

    (一)Windows窗口(MDICLIENT)样式介绍 /* Windows窗口样式 */ WS_BORDER //带有边框的窗口 WS_CAPTION //带有标题栏的窗口 WS_CHILD //子 ...

  2. Windows窗口样式速查参考,Delphi窗口控件的风格都有它们来决定(附Delphi何时用到它们,并举例说明)good

    /* 窗口样式参考列表(都是GetWindowLong的GWL_STYLE风格,都是TCreateParams.Sytle的一部分),详细列表如下:https://msdn.microsoft.com ...

  3. win32 htmlayout点击按钮创建新窗口,以及按钮图片样式

    最近在做一个C++ win32的桌面图形程序,我不是C++程序员,做这个只是因为最近没什么java的活. windows api,之前接触的时候,还是大学,那时用这个开发打飞机游戏纯粹是娱乐.现在基本 ...

  4. 按照已有的模板打印小票<二> ——调用windows打印机打印 可设置字体样式

    按照已有的模板打印小票<二> ——调用windows打印机打印 可设置字体样式 之前写过一篇文章<按照已有的模板输出一(如发票)>,是关于如何给已有的模板赋值.在项目的实践过程 ...

  5. 设置windows窗口ICON 【windows 编程】【API】【原创】

    1. ICON介绍 最近开始接触windows 编程,因此将自己所接触的一些零散的知识进行整理并记录.本文主要介绍了如何更改windows对话框窗口的ICON图标.这里首先介绍一下windows IC ...

  6. Windows窗口消息大全(转)

    Windows窗口消息大全,全不全自己看 ////////////////////////////////////////////////////////////////////////// #inc ...

  7. [MFC]_在vs2019中使用MFC快速构建简单windows窗口程序

    微软基础类库(英语: Classes,简称MFC)是微软公司提供的一个类库(class libraries),以C++类的形式封装了Windows API,并且包含一个应用程序框架,以减少应用程序开发 ...

  8. DOM访问元素样式和操作元素样式

    在HTML中定义样式的方式有三种:通过<link/>元素包含外部样式表文件(外部样式表).使用<style/>元素定义嵌入式样式(嵌入式样式表).使用style特性定义针对特定 ...

  9. 【转】Windows 窗口层次关系

    原文链接:undefined! 相信在Windows 下面编程的很多兄弟们都不是很清楚Windows 中窗口的层次关系是怎么样的,这个东西很久已经研究过一下,后来又忘记了,今天又一次遇到了这个问题,所 ...

  10. JavaScript 学习—— js获取行间样式和非行间样式

    1. 问题引入 <head> <style> #div1{ width:150px; height:200px; position:absolute; left:-150px; ...

随机推荐

  1. 三维模型OBJ格式轻量化压缩处理效率提高的技术方法探讨

    三维模型OBJ格式轻量化压缩处理效率提高的技术方法探讨 要提高三维模型OBJ格式轻量化压缩处理的效率,可以采取以下方法: 1.优化算法选择:选择合适的优化算法对模型进行轻量化处理.不同的优化算法有不同 ...

  2. WPF异步命令以及SqlSugar异步增删改查

    1.异步 /// <summary> /// 查询全部 /// </summary> /// <returns></returns> public as ...

  3. Python利用pandas拆分大型的csv文件

    当将大型CSV文件拆分成较小的文件时,您可以使用Python的Pandas库来处理 导入必要的库 import pandas as pd 定义拆分函数 当定义拆分函数时,我们将在以下步骤中处理CSV文 ...

  4. MySQL函数GROUP_CONCAT()函数简介

    一.数据需求按id分组然后把name用英文逗号分隔开 id name countryid age 1 曹操 1 56 2 刘备 2 47 3 孙权 3 38 4 司马懿 1 61 5 诸葛亮 2 42 ...

  5. KingbaseES索引坏块

    错误信息产生: 下面的报错一般为有坏块的产生. test=# select max(create_time) from public.tbl_table where create_time>=' ...

  6. 标准库unsafe:带你突破golang中的类型限制

    本文分享自华为云社区<突破语言golang中的类型限制>,作者:码乐. 1 简介 在使用c语言编程时,常常因为类型的问题大伤脑筋,而其他语言比如java,python默认类型又是难以改变的 ...

  7. ET介绍——事件机制EventSystem

    事件机制EventSystem ECS最重要的特性一是数据跟逻辑分离,二是数据驱动逻辑.什么是数据驱动逻辑呢?不太好理解,我们举个例子 一个moba游戏,英雄都有血条,血条会在人物头上显示,也会在左上 ...

  8. 利用 🤗 Optimum Intel 和 fastRAG 在 CPU 上优化文本嵌入

    嵌入模型在很多场合都有广泛应用,如检索.重排.聚类以及分类.近年来,研究界在嵌入模型领域取得了很大的进展,这些进展大大提高了基于语义的应用的竞争力.BGE.GTE 以及 E5 等模型在 MTEB 基准 ...

  9. Jmeter线程组-上

    线程组 线程组作为JMeter测试计划的核心组件之一,对于模拟并发用户的行为至关重要.线程组元件是整个测试计划的入口,所有的取样器和控制器必须放置在线程组下. 可以将线程组视为一个虚拟用户池,其中每个 ...

  10. #莫比乌斯反演,整除分块,欧拉定理#U137539 虚伪的最小公倍数

    题目 \[\large\prod_{i_1=1}^n\prod_{i_2=1}^n\dots\prod_{i_k=1}^n\frac{i_1*i_2*\dots*i_k}{gcd(i_1,i_2,\d ...