惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

P
Palo Alto Networks Blog
大猫的无限游戏
大猫的无限游戏
Martin Fowler
Martin Fowler
GbyAI
GbyAI
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
量子位
T
The Blog of Author Tim Ferriss
Y
Y Combinator Blog
Microsoft Azure Blog
Microsoft Azure Blog
C
CERT Recently Published Vulnerability Notes
Recent Announcements
Recent Announcements
A
About on SuperTechFans
aimingoo的专栏
aimingoo的专栏
P
Privacy International News Feed
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
博客园 - 叶小钗
L
Lohrmann on Cybersecurity
G
GRAHAM CLULEY
T
The Exploit Database - CXSecurity.com
Hugging Face - Blog
Hugging Face - Blog
P
Proofpoint News Feed
NISL@THU
NISL@THU
博客园 - Franky
C
Cybersecurity and Infrastructure Security Agency CISA
The Register - Security
The Register - Security
M
MIT News - Artificial intelligence
Know Your Adversary
Know Your Adversary
A
Arctic Wolf
F
Full Disclosure
T
Threat Research - Cisco Blogs
P
Privacy & Cybersecurity Law Blog
The Hacker News
The Hacker News
博客园 - 【当耐特】
D
Docker
T
Tailwind CSS Blog
S
SegmentFault 最新的问题
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Jina AI
Jina AI
Help Net Security
Help Net Security
V
Visual Studio Blog
小众软件
小众软件
B
Blog
Vercel News
Vercel News
云风的 BLOG
云风的 BLOG
N
News and Events Feed by Topic
Forbes - Security
Forbes - Security
N
Netflix TechBlog - Medium
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
C
Cisco Blogs
Security Archives - TechRepublic
Security Archives - TechRepublic

博客园 - 赖仪灵

分享几个简单的WPF控件(代码) 捕捉WPF应用程序中XAML代码解析异常 设置WPF窗口相对于非WPF窗口的位置 上海.NET俱乐部--微软社区巡展VSTS上海专题活动 WPF关于WindowInteropHelper的一个BUG WPF全景体验 最优化WPF 3D性能(基于“Tier-2”硬件) 闲话WPF之二六(WPF性能优化点) 闲话WPF之二五(WPF中的ControlTemplate [3]) 闲话WPF之二四(WPF中的ControlTemplate [2]) Windows Vista桌面窗口管理器(2) 闲话WPF之二三(WPF中的ControlTemplate [1]) 闲话WPF之二二(WPF中的Style) Windows Vista桌面窗口管理器(1) 闲话WPF之二一(WPF中的数据处理 [3]) 闲话WPF之二十(WPF中的传递事件 [2] ) 闲话WPF之十九(WPF中的传递事件 [1] ) 闲话WPF之十八(WPF中的资源 [4] ) 闲话WPF之十七(WPF中的资源 [3])
Windows Vista桌面窗口管理器(3)
赖仪灵 · 2007-01-25 · via 博客园 - 赖仪灵

前面曾经提到过,通过WDDM可以支持Surface的跨进程共享。共享DirectX表面对于重定向DirectX应用程序非常重要。因为Vista必须要和以前的应用程序兼容,就必须支持以前用GDI、、DirectX编写的应用程序。WDM必须把这些应用程序的窗口重定向到Surface,然后由WDM统一合成、最后显示一个单一的Surface。

需要注意的一点是:WDM只重定向Top-level的窗口。而对于MDI应用程序,它的所有Top-level窗口、子窗口会被合成为单独的一个Surface,然后交给DWM合成。根据以前的Windows图形系统。重定向主要分为以下三类:

1、只用GDI显示的窗口

毫无疑问,GDI应用程序在当今任是主流。WDM在重定向基于GDI的应用程序时,基本过程如下:
A、在系统内存中分配一个和窗口大小一样的内存块,然后和窗口关联。
B、显示内存中也分配一个同样大小、指定象素格式的显存块。
C、然后,当应用程序获得窗口的DC时,因为这个窗口还没有参与到WDM的合成,所以现在,它活动的DC不在是主视频内存中,而且前面在系统内存中分配的内存块。
D、经过GDI的操作后,在系统内存形成一个Surface。
E、系统会根据窗口的各种参数、适当的从系统内存复制显示内容到视频内存中。
F、这样,视频内存的数据就和窗口保持一致,剩下的工作就由WDM完成:合成各个Surface,形成最终的桌面。

另外还有两点需要特别说明:

(1)、双缓冲窗口。现在,双缓冲技术显示的窗口特别多,它能有效的避免闪烁。确实,在使用了双缓冲的GDI窗口中,它本身就有两个内存块,一个在系统,一个在显卡。所以问题来了:为什么重定向时不直接使用双缓冲中的显示内存块呢?这样做主要有两个问题:一是格式不相同,GDI显示的格式和DirectX的格式不相同。GDI不支持以DirectX格式进行提交。二是很多GDI操作(XOR、文本、Alpha混合等等)是一种“读取-修改-写回”这样的三步操作。如果重定向时直接使用显存块,GDI显示的时候必须从显存读取原来的显示内容到CPU(或者系统内存),然后再修改,最后写回到显存。这样的操作效率非常低。所以没有采用。

(2)、最小化窗口。通常,最小化后的窗口只显示在任务栏的一个很小范围内,我们需要画窗口的大小估计也只有130X30。但是,在DWM中没有采用这种用法。因为,如果窗口最小化后我们把Surface的大小修改为130x30再按需显示,这样会在Filp3D或者取缩略图时有问题,因此窗口已经被修改。所以,DWM在窗口最小化后保存了最后一次更新的Sureface内容。

2、只用DirectX显示的窗口

由于DirectX应用程序通常是通过调用Present()函数进行Surface的提交,所以这类应用程序通常只需要一个窗口缓冲就可以实现重定向。这种DirectX窗口的重定向是由DirectX系统(实际上是DirectX 10)处理的,当DirectX10决定显示某个Surface时,它会调用DWM的接口,以此实现跨进程的共享。DirectX 10的“Furface共享”是一个非常独特的功能,其建立在WDDM之上。这也是运行DWM必须要WDDM的关键原因之一。

当Present()显示Surface时,DWM会得到通知,表示应该更新其原来的窗口Surface,更新后DWM再重新进行合成。注意WPF应用程序也是DirectX应用程序。它们也是采用这种重定向方式。

3、混合GDI和DirectX的窗口

现在,有很多的Top-level窗口采用了GDI+DirectX的方式进行内容显示。根据混合的方式不同结果也不同。如果Top-Level窗口以及它的每个子窗口是用唯一的方式进行显示,比如主窗口只用DirectX,子窗口只用了GDI,DWM对这样的窗口会形成自己的“合成”树。没有子窗口单独显示,然后整个Tree的Surface被合成为传递给桌面。这样的混合方式能很好的实现。

对于单独一个Top-level窗口同时使用GDI+DirectX显示,比较麻烦。特别是GDI+DirectX对窗口的某个区域进行重复显示的情况。DWM通常不支持这样的窗口。