DirectComposition 基础

简介

常用的DirectX接口中通常会使用Render和Codec。但是在实际使用中,一个APP最终呈现都是以2D平面的方式来展现,最后阶段通常需要将不同的位图进行组合。例如播放器,得到了视频内容之后通常需要在视频内容之上再画上操作的UI以及弹幕之类的。因此可以并行渲染UI,最后将UI贴到内容上。其中还涉及Alpha等操作。

针对这种位图进行组合的场景,DirectComposition就提供了这种高效的API。

Components

DirectComposition有三部分组成

  • dcomp.dll - 提供了DirectComposition API
  • dwmcore.dll - 负责桌面Composition的组件
  • win32k.sys - 用来负责app和dwmcore通信

directcomposition top-level architecture

 Bitmaps和Visual

DirectComposition中最重要的两类对象,Bitmap和Visual。Bitmap代表需要组合的位图,可以为Surface和SwapChain。其会关联到Visual对象的Content属性。而VIsual定义了不同Bitmap组合的空间关系。其表现为一棵树,根就为root visual对象。下面的每个子对象为child visual。子节点会处于父节点上方,这样就用树确定了不同位图的z-order。如下图

a composition of visuals and the corresponding visual tree

 父节点维护其子节点的z-order,也就确定了子节点彼此之间的重叠顺序。越靠后的节点会叠在靠前节点的上方。因此对比其Bitmap,更多的是针对Visual对象的处理。

the z-order of overlapping child visuals

 其中有如下属性

  • Content - Visual 对象提供了IDCompositionVisual::SetContent 函数来关联Bitmap
  • Clip - 该属性制定了Visual对象的可显示区域,只有在Clip范围中的内容才会被显示。通过IDCompositionVisual::SetClip设置。
  • BorderMode - 设置合成Visual对象的Bitmap时边缘的组成方式。
  • BitmapInterpolationMode - 组合时bitmap和屏幕上像素的对应关系
  • CompositeMode - Visual之间的混合模式
  • OffsetX和OffsetY - Visual之间通过左上角定位,OffsetX和OffsetY用来定位组合时偏移
  • Effect - 设定组合方式,例如透明度
  • Transform - 制定了组合时的2D变换方式。可是实现平移,旋转,缩放等。
  • TransformParent - 设置非父节点之外的节点为坐标系参考Visual.

和DirectX3D 一样,所有的操作都会创建Device对象,用DCompositionCreateDevice创建。其会关联底层的HW的上下文资源。之后可以通过该对象创建该HW支持的Visual, Clip等的对象。另外还有Commit方法可以将设定好的Visual树提交给Composition来处理。

需要注意的是该对象只是HW抽象的上下文。可以创建多个对象,但是通常不同Device资源互相隔离。可以利用创建不同Device来进行并行处理。

组合目标窗口

 和Direct3D一样,最终Composit的结果需要显示到窗口上。整个窗口就是组合目标窗口Composition Target Window。一个窗口上最多绑定两个Visual Tree。关系如下图

the conceptual layers of a window

Transaction

也和Direct3D一样,对Composition的操作也是先进行操作命令的设定,最后再提交处理。DWM会在进行桌面组合时手机每个应用的Composition的任务进行统一计算,最后flip。通过IDCompositionSurface的方法BeginDraw和EndDraw来进行同步,最后调用设备对象Commit。

处理顺序

DirectComposition在处理的时候只会对每一个属性进行一次计算,如果修改多次属性,最终之后最后一次设置的值有效,之前的设置会被覆盖。处理的先后循序如下

result of applying all four properties to a visual

 有例外的是,Tranform和Effect可以通过Group来绑定先后处理的多个属性。

最后DirectComposition针对同一个Device对象需要保证单线程顺序操作。而可以针对不同设备对象用不同的线程进行同步操作。但是需要有特定的写法。

最后列一下DWM进行Composition顺序

  1. 预计下一帧Vsync时间
  2. 收集所有的Composition的任务。
  3. 处理收集到的Composition任务。
  4. 使用步骤1中估计的时间间隔来计算Composition的动画效果。
  5. 确定组合的屏幕区域。
  6. 组合dirty区域。
  7. Flip。
  8. 如果在步骤6和7中没有任务,会等待新任务提交。
  9. 等待Vsync。

composition frame scheduling

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值