Desktop window Manager(DWM,先前的DCE,桌面组合引擎)是窗口管理器的组件,在Window Vista中引入,其引进了Window Aero图形用户接口和可视的主题。DWM要求图形卡支持DirectX9.0和Shader模式2.0.DWM在Vista Starter版本中没有,只有Vista Home基础版中有,但许多Window Aero接口(例如Glass和Flip 3D)都无效。在Windows Server 2008中也可以,但桌面体验特性和兼容的图形驱动程序是必须的。
架构
使用DWM,应用程序并不直接地画到显存中,取而代之的行为是将内容画到系统内存的off屏幕缓冲区,这个缓冲区又DWM组合到一起而最终渲染到屏幕上,每秒许多次。某种意义上说,他与Mac OS X的Quartz Compositor相似。因为Compositor已经访问所有程序的图形。DWM使用Direct 9X来执行组合功能并最终在GPU中render,将CPU从Screen Buffer到显示器的渲染过程解脱出来。然而这并不映像应用程序paint到off屏幕缓冲区,依赖于使用什么样的技术,可能仍然是CPU绑定的。DWM结构在DWM兼容格式中可用。缓冲区中的窗口内容转换到DirectX 素材。
桌面本身是满屏的Direct3D表面,其窗口使用两个相邻三角形表达的网格可以变换到2D的矩形。素材,代表UI映射到这些矩形上。窗口转换实现为网格转换,使用shader程序。Windows Vista,转换限制在实现转换的内建阴影中。 DWM仅仅将主桌面对象映射到一个3D表面,其他的桌面对象,包括虚拟桌面和UAC使用或不适用的安全桌面。
由于所有的应用程序都render到一个off-screen缓冲区,他们也可以同样读取嵌入到其他程序的缓冲区。由于off-screen缓冲区是有应程序经常更新,嵌入的rendering将是应用程序窗口的动态表达而不是静态的rendering。这就是live thumbnail 预览,Windows Flip和Window Flip3D在Windows Vista如何工作的。 DWM使用MIL(媒体集成层,未托管的compositor,和WPF一道共享)来将窗口表达为在一个composition树上的一个composition节点,表示桌面和所有在里面的窗口,这些通过MIL从场景后到前render。由于所有的窗口对最终的图象都有贡献,因此复合像素的颜色由多个窗口决定,这用来实现透明度的效果。DWM允许自定义阴影来控制怎么样将多个应用程序创建符合像素。DWM包括内建的Pixel shader2.0程序,其计算窗口中像素的颜色,其平均临近和后面窗口中的像素值。这些引用被DWM用来在DWM管理的窗口边界获得blur效果。
由于MIL通过composition树来提供一个retained mode图象系统,在窗口被移动时需要repaint和refresh的工作就由DWM和MIL处理,将应用程序从其free出来。已经在composition树和off-screen缓冲区中的背景数据,直接用来render背景, 而不用让背景应用程序通过发送WM_PAINT来重绘它们自己,就象Vista之前系统所做的一样。DWM使用双缓冲区,避免在移动窗口的时候闪烁或抖动,composition引擎使用例如挑选的优化办法来提高性能,避免重画没有变化的部分。由于compositor是多监视器感知的,DWM天生支持这些。在满屏应用程序中,例如游戏,DWM并不执行窗口组合而因此性能并没有相当大的降低。
重定向
对于非DWM感知的rendering技术,输出必须被重定向到DWM缓冲区。对于窗口,GDI或DirectX任何一个都可以用来rendering。为了让这两个能与DWM一起工作,DWM为其提供了重定向技术。
对于GDI,Microsoft Windows中最常用的rendering技术,每个应用程序窗口在其部分或全部需要显示的时候,都是应用程序的工作去rendering它们自己。如果没有DWM,rendering在视频内存缓冲区中扫描。在DWM下,系统内存中分配一个与窗口大小相等的缓冲区。GDI调用被重定向到去写这些缓冲区,而不是直接到视频内存。另外一个缓冲区在video内存中分配来表示DirectX表面,其作为窗口网格的素材。系统内存缓冲区分别被转换到DirextX表面,并且同步进行。这个过程是必须的,由于GDI不能直接输出DirextX像素格式。表面由compositor和来读,并且组合到视频内存的桌面中。写GDI输出到系统内存不是硬件减速的,也不是转换到DirextX表面。当一个GDI窗口被最小化的,其通过GDI的限制,缓冲区不再更新。因此,DWM使用应用程序被最小化之前的最后一幅位图来render缓冲区。
对于使用DirextX来写3D表面的应用程序,Windows Vista中实现的DirextX使用WDDM来与DWM共享表面。DWM然后直接使用表面并且与窗口网格映射。对于WPF程序,这些是DirextX程序,compositorrender这些共享的表面,其被组合到最终的桌面。应用程序能混合多child窗口的renderng技术,只要GDI和DirextX都被用来render相同的窗口。这种情况,DirextX和 GDI的rendering的顺序不能保证,并且例如不能保证来自系统内存的GDI位图是否应经被传递到视频内存表面。因此,最终的组合可能没有包含GDIrendered元素。为了阻止这个发生,DWM被临时关闭,只要应用程序是在同一个窗口混合运行GDI和DirextX。