資源概觀
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 函式.)
除了轉譯目標之外,處理站所建立的所有資源都是與裝置無關。 轉譯目標是裝置相依的資源。
Device-Dependent資源
上一個清單中未命名的任何資源都是裝置相依的資源。 裝置相依資源會與特定的轉譯裝置相關聯。 當硬體加速可用時,該裝置就是 GPU。 在其他情況下,它是 CPU。
若要建立大部分的裝置相依資源,請使用轉譯目標。 在大部分情況下,請使用 Factory 來建立轉譯目標。
以下是裝置相依資源的範例:
- ID2D1Brush 和繼承自它的介面。 使用轉譯目標來建立筆刷。
- ID2D1Layer。 使用轉譯目標來建立圖層。
- ID2D1RenderTarget 和繼承自它的介面。 若要建立轉譯目標,請使用 Factory 或其他轉譯目標。
注意
從 Windows 8 開始,有新的介面可建立裝置相依資源。 如果裝置內容和資源是從相同的 ID2D1Device 建立,則ID2D1DeviceCoNtext和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_TYPE_HARDWARE D2D1_RENDER_TARGET_PROPERTIES結構的類型欄位。
DXGI Surface 轉譯目標
您可以與任何其他使用相同基礎 Direct3D 裝置的 DXGI 表面轉譯目標共用 DXGI 表面轉譯目標所建立的資源。
相容的轉譯目標和共用點陣圖
您可以在轉譯目標與由該轉譯目標建立的相容轉譯目標之間共用資源。 若要建立相容的轉譯目標,請使用 ID2D1RenderTarget::CreateCompatibleRenderTarget 方法。
如果方法成功,您可以使用 ID2D1RenderTarget::CreateSharedBitmap 方法來建立可在方法呼叫中指定的兩個轉譯目標之間共用的 ID2D1Bitmap 。 只要兩個轉譯目標使用相同的基礎裝置進行轉譯,這個方法就會成功。