Ressourcenübersicht

Eine Direct2D-Ressource ist ein Objekt, das zum Zeichnen verwendet wird und durch eine Direct2D-Schnittstelle wie ID2D1Geometry oder ID2D1RenderTarget dargestellt wird. In diesem Thema werden die Arten von Direct2D-Ressourcen beschrieben und wie sie freigegeben werden können.

Dieses Thema enthält folgende Abschnitte:

Informationen zu Direct2D-Ressourcen

Viele hardwarebeschleunigte 2D-APIs basieren auf einem CPU-fokussierten Ressourcenmodell und einer Reihe von Renderingvorgängen, die auf CPUs gut funktionieren.Dann ist ein Teil der API hardwarebeschleunigt. Die Implementierung dieser APIs erfordert einen Ressourcen-Manager zum Zuordnen von CPU-Ressourcen zu Ressourcen auf der GPU. Aufgrund von GPU-Einschränkungen können einige Vorgänge möglicherweise nicht unter allen Umständen beschleunigt werden. In diesen Fällen muss der Ressourcen-Manager zwischen cpu und GPU (was teuer ist) hin und her kommunizieren, damit er zum CPU-Rendering übergehen kann. In einigen Fällen kann es unvorhersehbar sein, dass das Rendering vollständig auf die CPU zurückfällt. Darüber hinaus sind einfache Renderingvorgänge möglicherweise temporäre Zwischenrenderingschritte erforderlich, die in der API nicht verfügbar gemacht werden und zusätzliche GPU-Ressourcen erfordern.

Direct2D bietet eine direktere Zuordnung, um die GPU vollständig zu nutzen. Sie stellt zwei Ressourcenkategorien bereit: geräteunabhängig und geräteabhängig.

  • Geräteunabhängige Ressourcen, z. B . ID2D1Geometry, werden auf der CPU beibehalten.
  • Geräteabhängige Ressourcen, z. B. ID2D1RenderTarget und ID2D1LinearGradientBrush, werden ressourcen auf der GPU direkt zugeordnet (wenn die Hardwarebeschleunigung verfügbar ist). Renderingaufrufe werden ausgeführt, indem Vertex- und Abdeckungsinformationen aus einer Geometrie mit Texturierungsinformationen kombiniert werden, die von den geräteabhängigen Ressourcen erzeugt werden.

Wenn Sie geräteabhängige Ressourcen erstellen, werden systemressourcen (die GPU, sofern verfügbar oder die CPU) zugewiesen, wenn das Gerät erstellt wird, und ändern sich nicht von einem Renderingvorgang in einen anderen. Dadurch entfällt die Notwendigkeit eines Ressourcenmanagers. Zusätzlich zu den allgemeinen Leistungsverbesserungen, die durch die Eliminierung eines Ressourcen-Managers bereitgestellt werden, können Sie mit diesem Modell jedes Zwischenrendering direkt steuern.

Da Direct2D so viel Kontrolle über Ressourcen bietet, müssen Sie die verschiedenen Arten von Ressourcen verstehen und wissen, wann sie zusammen verwendet werden können.

Device-Independent Ressourcen

Wie im vorherigen Abschnitt beschrieben, befinden sich geräteunabhängige Ressourcen immer auf der CPU und werden nie einem Hardwarerenderinggerät zugeordnet. Im Folgenden sind geräteunabhängige Ressourcen aufgeführt:

Verwenden Sie eine ID2D1Factory, selbst eine geräteunabhängige Ressource, um geräteunabhängige Ressourcen zu erstellen. (Um eine Factory zu erstellen, verwenden Sie die CreateFactory-Funktion .)

Mit Ausnahme von Renderzielen sind alle von einer Factory erstellten Ressourcen geräteunabhängig. Ein Renderziel ist eine geräteabhängige Ressource.

Device-Dependent Ressourcen

Jede Ressource, die in der vorherigen Liste nicht benannt ist, ist eine geräteabhängige Ressource. Geräteabhängige Ressourcen sind einem bestimmten Renderinggerät zugeordnet. Wenn die Hardwarebeschleunigung verfügbar ist, ist dieses Gerät die GPU. In anderen Fällen ist es die CPU.

Verwenden Sie zum Erstellen der meisten geräteabhängigen Ressourcen ein Renderziel. Verwenden Sie in den meisten Fällen eine Factory, um ein Renderziel zu erstellen.

Im Folgenden finden Sie Beispiele für geräteabhängige Ressourcen:

  • ID2D1Brush und die Schnittstellen, die davon erben. Verwenden Sie ein Renderziel, um Pinsel zu erstellen.
  • ID2D1Layer. Verwenden Sie ein Renderziel, um Ebenen zu erstellen.
  • ID2D1RenderTarget und die Schnittstellen, die davon erben. Verwenden Sie zum Erstellen eines Renderziels eine Factory oder ein anderes Renderziel.

Hinweis

Ab Windows 8 gibt es neue Schnittstellen, die geräteabhängige Ressourcen erstellen. Ein ID2D1Device und ein ID2D1DeviceContext können eine Ressource gemeinsam nutzen, wenn der Gerätekontext und die Ressource aus demselben ID2D1Device erstellt werden.

 

Geräteabhängige Ressourcen können nicht mehr verwendet werden, wenn die zugehörigen Renderinggeräte nicht mehr verfügbar sind. Dies bedeutet, dass Sie das Renderziel und alle zugehörigen Ressourcen neu erstellen müssen, wenn Sie den D2DERR_RECREATE_TARGET-Fehler für ein Renderziel erhalten.

Freigeben von Factoryressourcen

Sie können alle geräteunabhängigen Ressourcen, die von einer Factory erstellt wurden, mit allen anderen Ressourcen (geräteunabhängig oder geräteabhängig) teilen, die von derselben Factory erstellt wurden. Sie können beispielsweise zwei ID2D1RenderTarget-Objekte verwenden, um dieselbe ID2D1RectangleGeometry zu zeichnen, wenn beide ID2D1RenderTarget-Objekte von derselben Factory erstellt wurden.

Die Senkenschnittstellen (ID2D1SimplifiedGeometrySink, ID2D1GeometrySink und ID2D1TessellationSink) können für Von jeder Factory erstellte Ressourcen freigegeben werden. Im Gegensatz zu anderen Schnittstellen in Direct2D kann jede Implementierung einer Senkenschnittstelle verwendet werden. Sie können beispielsweise Ihre eigene Implementierung von ID2D1SimplifiedGeometrySink verwenden.

Freigeben von Renderzielressourcen

Ihre Fähigkeit zum Freigeben von Ressourcen, die von einem Renderziel erstellt wurden, hängt von der Art des Renderziels ab. Wenn Sie ein Renderziel vom Typ D2D1_RENDER_TARGET_TYPE_DEFAULT erstellen, können die von diesem Renderziel erstellten Ressourcen nur von diesem Renderziel verwendet werden (es sei denn, das Renderziel passt in eine der in den folgenden Abschnitten beschriebenen Kategorien). Dies tritt auf, weil Sie nicht wissen, welches Gerät das Renderziel am Ende verwenden wird. Dies kann zum Rendern auf lokaler Hardware, Software oder auf der Hardware eines Remoteclients führen. Sie könnten beispielsweise ein Programm schreiben, das nicht mehr funktioniert, wenn es remote angezeigt wird oder wenn das Renderziel über die maximale Größe hinaus erhöht wird, die von der Renderinghardware unterstützt wird.

In den folgenden Abschnitten werden die Umstände beschrieben, unter denen eine von einem Renderziel erstellte Ressource für ein anderes Renderziel freigegeben werden kann.

Hardwarerenderungsziele

Sie können Ressourcen für jedes Renderziel freigeben, das explizit Hardware verwendet, solange der Remotingmodus kompatibel ist. Der Remotingmodus ist nur dann kompatibel, wenn beide Renderziele das D2D1_RENDER_TARGET_USAGE_FORCE_BITMAP_REMOTING- oder D2D1_RENDER_TARGET_USAGE_GDI_COMPATIBLE-Verwendungsflag verwenden oder keines der beiden Flags angegeben ist. Diese Einstellungen garantieren, dass sich die Ressourcen immer auf demselben Computer befinden. Um einen Verwendungsmodus anzugeben, legen Sie das Verwendungsfeld der D2D1_RENDER_TARGET_PROPERTIES-Struktur fest, die Sie zum Erstellen des Renderziels mit mindestens einem D2D1_RENDER_TARGET_USAGE Flags verwendet haben.

Um ein Renderziel zu erstellen, das explizit Hardwarerendering verwendet, legen Sie das Typfeld der D2D1_RENDER_TARGET_PROPERTIES-Struktur , die Sie zum Erstellen des Renderziels verwendet haben, auf D2D1_RENDER_TARGET_TYPE_HARDWARE fest.

DXGI Surface Render-Ziele

Sie können Ressourcen, die von einem DXGI-Oberflächenrenderungsziel erstellt wurden, mit jedem anderen DXGI-Oberflächenrenderungsziel teilen, das dasselbe zugrunde liegende Direct3D-Gerät verwendet.

Kompatible Renderziele und freigegebene Bitmaps

Sie können Ressourcen zwischen einem Renderziel und kompatiblen Renderzielen freigeben, die von diesem Renderziel erstellt werden. Verwenden Sie zum Erstellen eines kompatiblen Renderziels die ID2D1RenderTarget::CreateCompatibleRenderTarget-Methode .

Sie können die ID2D1RenderTarget::CreateSharedBitmap-Methode verwenden, um eine ID2D1Bitmap zu erstellen, die zwischen den beiden Renderzielen freigegeben werden kann, die im Methodenaufruf angegeben sind, wenn die Methode erfolgreich ist. Diese Methode ist erfolgreich, solange die beiden Renderziele dasselbe zugrunde liegende Gerät zum Rendern verwenden.