共用方式為


資源概觀

Direct2D 資源是一個物件,用於繪製,並以 Direct2D 介面表示,例如 ID2D1GeometryID2D1RenderTarget。 本主題描述 Direct2D 資源種類及其共用方式。

本主題包含下列各節:

關於 Direct2D 資源

許多硬體加速的 2D API 是圍繞以 CPU 為主的資源模型和一組適用於 CPU 的轉譯作業所設計。然後,API 的某些部分會加速硬體。 實作這些 API 需要資源管理員,才能將 CPU 資源對應至 GPU 上的資源。 由於 GPU 限制,某些作業可能無法在每個情況下加速。 在這些情況下,資源管理器必須在 CPU 和 GPU 之間頻繁地進行溝通(這樣做是昂貴的),以便將工作轉換為 CPU 渲染。 在某些情況下,可能會無法預期地強制渲染完全回退到 CPU。 此外,看似簡單的轉譯作業可能需要 API 中未公開且需要額外 GPU 資源的暫時中繼轉譯步驟。

Direct2D 提供了一個更直接的方式,讓 GPU 發揮其全部效能。 它提供兩種資源類別:裝置獨立和裝置相依。

  • 裝置無關的資源,例如 ID2D1Geometry,會保留在 CPU 上。
  • 裝置相依資源,例如 ID2D1RenderTargetID2D1LinearGradientBrush,直接對應至 GPU 上的資源(可用硬體加速時)。 轉譯呼叫是藉由結合幾何中的頂點和涵蓋範圍資訊與來自裝置相依資源的材質資訊來執行。

當您建立裝置相依資源時,系統會在建立裝置時配置系統資源(如果有 GPU 可用,則為 GPU,否則為 CPU),且在不同的渲染作業之間不會變更。 這種情況可免除資源管理員的需求。 除了消除資源管理員所提供的一般效能改進之外,此模型還可讓您直接控制任何中繼轉譯。

因為 Direct2D 對資源提供如此多的控制,所以您必須瞭解不同類型的資源,以及它們何時可以一起使用。

Device-Independent 資源

如上一節所述,與裝置無關的資源一律位於CPU上,且永遠不會與硬體轉譯裝置相關聯。 以下是與裝置無關的資源:

使用 ID2D1Factory,本身為裝置獨立資源,以建立與裝置無關的資源。 (若要建立處理站,請使用 CreateFactory 函式。

除了轉譯目標以外,處理站所建立的所有資源都與裝置無關。 轉譯目標是裝置相依的資源。

Device-Dependent 資源

在上一個清單中未命名的任何資源都是裝置相依的資源。 裝置相依資源會與特定轉譯裝置相關聯。 當硬體加速可用時,該裝置就是 GPU。 在其他情況下,它是 CPU。

若要建立大部分的裝置相依資源,請使用繪圖目標。 在大部分情況下,使用工廠建立繪製目標。

以下是裝置相依資源的範例:

  • ID2D1Brush,以及繼承自它的介面。 使用渲染目標來建立筆刷。
  • ID2D1Layer。 使用渲染目標來建立圖層。
  • ID2D1RenderTarget,以及從其繼承的介面。 若要建立渲染目標,請使用工廠或其他渲染目標。

注意

從 Windows 8 開始,有新的介面可建立裝置相依資源。 ID2D1DeviceID2D1DeviceContext 可以共用資源,前提是裝置內容和資源都是從相同的 ID2D1Device建立的。

 

當相關聯的轉譯裝置無法使用時,裝置相依的資源就會變成無法使用。 這表示當您收到轉譯目標 D2DERR_RECREATE_TARGET 錯誤時,您必須重新建立轉譯目標及其所有資源。

共享工廠資源

您可以將處理站所建立的所有裝置獨立資源與相同處理站所建立的所有其他資源(與裝置無關或裝置相依的資源)共用。 例如,您可以使用兩個 ID2D1RenderTarget 物件來繪製相同的 ID2D1RectangleGeometry,前提是這兩個 ID2D1RenderTarget 物件都是由同一個工廠建立的。

匯入介面(ID2D1SimplifiedGeometrySinkID2D1GeometrySink,以及 ID2D1TessellationSink)可以與由任何工廠建立的資源共享。 不同於 Direct2D 中的其他介面,接收介面的任何實作都可以使用。 例如,您可以使用您自己實作的 ID2D1SimplifiedGeometrySink

共用渲染目標資源

您共用轉譯目標所建立資源的能力取決於轉譯目標的類型。 當您建立類型為 D2D1_RENDER_TARGET_TYPE_DEFAULT的轉譯目標時,該轉譯目標所建立的資源只能由該轉譯目標使用(除非轉譯目標符合下列各節所述的其中一個類別)。 這是因為您不確定渲染目標最終會使用哪種裝置——可能會渲染到本機硬體、軟體,或遠端客戶端的硬體。 例如,您可以撰寫程式,在遠端顯示時停止運行,或當渲染目標的大小超過渲染硬體所支援的大小上限時,停止運行。

下列各節說明一個轉譯目標所建立的資源可以與另一個轉譯目標共享的情況。

硬體渲染目標

只要遠端模式相容,您就可以在任何明確使用硬體的渲染目標之間共享資源。 只有當兩個轉譯目標都使用 D2D1_RENDER_TARGET_USAGE_FORCE_BITMAP_REMOTINGD2D1_RENDER_TARGET_USAGE_GDI_COMPATIBLE 旗標,或未指定任何旗標時,遠端模式才能保證相容。 這些設定可確保資源一律位於同一部計算機上。 若要指定使用模式,請在您用來建立轉譯目標的 D2D1_RENDER_TARGET_PROPERTIES 結構中,設定 使用量 字段,並使用一或多個 D2D1_RENDER_TARGET_USAGE 旗標。

若要建立明確使用硬體繪圖的轉譯目標,請將用於建立轉譯目標的 D2D1_RENDER_TARGET_PROPERTIES 結構中的 類型 欄位設為 D2D1_RENDER_TARGET_TYPE_HARDWARE

DXGI Surface 渲染目標

您可以與任何其他使用相同基礎 Direct3D 裝置的 DXGI 表面轉譯目標共用 DXGI 表面轉譯目標所建立的資源。

兼容的渲染目標和共享位圖

您可以在轉譯目標與該轉譯目標所建立的相容轉譯目標之間共用資源。 若要建立相容的轉譯目標,請使用 ID2D1RenderTarget::CreateCompatibleRenderTarget 方法。

您可以使用 ID2D1RenderTarget::CreateSharedBitmap 方法來建立可在方法呼叫中指定的兩個轉譯目標之間共用的 ID2D1Bitmap,如果該方法成功執行。 只要兩個轉譯目標使用相同的基礎裝置進行轉譯,這個方法就會成功。