资源概述
Direct2D 资源是用于绘制的对象,由 Direct2D 接口(如 ID2D1Geometry 或 ID2D1RenderTarget)表示。 本主题介绍 Direct2D 资源的种类及其共享方式。
本主题包含以下各节:
关于 Direct2D 资源
许多硬件加速的 2D API 都是围绕以 CPU 为中心的资源模型和一组在 CPU 上正常工作的渲染操作设计的。然后,API 的某些部分是硬件加速的。 实现这些 API 需要资源管理器将 CPU 资源映射到 GPU 上的资源。 由于 GPU 限制,某些操作可能无法在各种情况下加速。 在这些情况下,资源管理器必须在 CPU 和 GPU (之间来回通信,这) 成本高昂,以便可以转换为 CPU 呈现。 在某些情况下,它可能会不可预知地强制呈现完全回退到 CPU。 此外,看似简单的呈现操作可能需要临时的中间呈现步骤,这些步骤不会在 API 中公开,并且需要额外的 GPU 资源。
Direct2D 提供更直接的映射来充分利用 GPU。 它提供两类资源:与设备无关和依赖于设备的资源。
- 独立于设备的资源(如 ID2D1Geometry)保留在 CPU 上。
- 当硬件加速) 可用时,依赖于设备的资源(如 ID2D1RenderTarget 和 ID2D1LinearGradientBrush)直接映射到 GPU (上的资源。 通过将几何图形中的顶点和覆盖信息与设备依赖资源生成的纹理信息相结合来执行呈现调用。
创建依赖于设备的资源时,系统资源 (GPU(如果可用)或在创建设备时分配 CPU) ,并且不会从一个呈现操作更改为另一个呈现操作。 这种情况无需使用资源管理器。 除了消除资源管理器带来的常规性能改进外,此模型还使你能够直接控制任何中间呈现。
由于 Direct2D 对资源提供如此多的控制,因此必须了解不同类型的资源以及何时可以一起使用。
Device-Independent资源
如上一部分所述,与设备无关的资源始终驻留在 CPU 上,从不与硬件呈现设备关联。 以下是与设备无关的资源:
- ID2D1DrawingStateBlock
- ID2D1Factory
- ID2D1Geometry 以及从其继承的接口。
- ID2D1GeometrySink 和 ID2D1SimplifiedGeometrySink
- ID2D1StrokeStyle
使用 ID2D1Factory(本身是与设备无关的资源)来创建与设备无关的资源。 (若要创建工厂,请使用 CreateFactory function.)
除呈现目标外,工厂创建的所有资源都是与设备无关的。 呈现器目标是依赖于设备的资源。
Device-Dependent资源
上一列表中未命名的任何资源都是依赖于设备的资源。 依赖于设备的资源与特定呈现设备相关联。 当硬件加速可用时,该设备是 GPU。 在其他情况下,它是 CPU。
若要创建大多数依赖于设备的资源,请使用呈现器目标。 在大多数情况下,使用工厂创建呈现器目标。
下面是与设备相关的资源的示例:
- ID2D1Brush 以及从其继承的接口。 使用呈现器目标创建画笔。
- ID2D1Layer。 使用呈现器目标创建层。
- ID2D1RenderTarget 以及从它继承的接口。 若要创建呈现目标,请使用工厂或其他呈现目标。
注意
从 Windows 8 开始,有一些新的接口可以创建与设备相关的资源。 如果设备上下文和资源是从同一 ID2D1Device 创建的,则 ID2D1Device 和 ID2D1DeviceContext 可以共享资源。
当关联的呈现设备不可用时,依赖于设备的资源变得不可用。 这意味着,当收到呈现目标 D2DERR_RECREATE_TARGET 错误时,必须重新创建呈现器目标及其所有资源。
共享工厂资源
可以将工厂创建的所有与设备无关的资源共享给 (同一工厂创建的与设备无关或依赖于设备的) 的所有其他资源。 例如,如果这两个 ID2D1RenderTarget 对象都是由同一工厂创建的,则可以使用两个 ID2D1RenderTarget 对象绘制相同的 ID2D1RectangleGeometry。
接收器接口 (ID2D1SimplifiedGeometrySink、 ID2D1GeometrySink 和 ID2D1TessellationSink) 可与任何工厂创建的资源共享。 与 Direct2D 中的其他接口不同,可以使用接收器接口的任何实现。 例如,可以使用自己的 ID2D1SimplifiedGeometrySink 实现。
共享呈现器目标资源
你能否共享呈现器目标创建的资源取决于呈现器目标的类型。 创建 D2D1_RENDER_TARGET_TYPE_DEFAULT 类型的呈现器目标时,该呈现器目标创建的资源只能由该呈现目标 (使用,除非呈现目标适合以下部分) 所述的类别之一。 出现这种情况是因为你不知道呈现目标最终将使用什么设备,它最终可能会呈现到本地硬件、软件或远程客户端的硬件。 例如,可以编写一个程序,该程序在远程显示或呈现目标的大小增大到超出呈现硬件支持的最大大小时停止工作。
以下部分介绍一个呈现器目标创建的资源可以与另一个呈现目标共享的情况。
硬件呈现目标
只要远程处理模式兼容,就可以在显式使用硬件的任何呈现目标之间共享资源。 仅当两个呈现目标都使用 D2D1_RENDER_TARGET_USAGE_FORCE_BITMAP_REMOTING 或 D2D1_RENDER_TARGET_USAGE_GDI_COMPATIBLE 用法标志,或者两个标志均未指定时,才保证远程处理模式兼容。 这些设置保证资源始终位于同一台计算机上。 若要指定使用模式,请设置用于创建具有一个或多个D2D1_RENDER_TARGET_USAGE标志的呈现目标的D2D1_RENDER_TARGET_PROPERTIES结构的用法字段。
若要创建显式使用硬件呈现的呈现目标,请将用于创建呈现目标的 D2D1_RENDER_TARGET_PROPERTIES 结构的 type 字段设置为D2D1_RENDER_TARGET_TYPE_HARDWARE。
DXGI Surface 渲染目标
你可以与使用同一基础 Direct3D 设备的任何其他 DXGI 图面呈现目标共享由 DXGI 图面呈现目标创建的资源。
兼容的呈现目标和共享位图
可以在呈现目标与由该呈现目标创建的兼容呈现目标之间共享资源。 若要创建兼容的呈现目标,请使用 ID2D1RenderTarget::CreateCompatibleRenderTarget 方法。
如果方法成功,可以使用 ID2D1RenderTarget::CreateSharedBitmap 方法创建可在方法调用中指定的两个呈现目标之间共享的 ID2D1Bitmap 。 只要两个呈现目标使用相同的基础设备进行呈现,此方法就会成功。