Übersicht über Ressourcen

Eine Direct2D-Ressource ist ein Objekt, das zum Zeichnen verwendet wird und durch eine Direct2D-Schnittstelle wie ID2D1Geometry oder ID2D1RenderTargetdargestellt wird. In diesem Thema werden die Arten von Direct2D-Ressourcen und deren Freigabe beschrieben.

Dieses Thema enthält folgende Abschnitte:

Informationen zu Direct2D-Ressourcen

Viele hardwarebeschleunigte 2D-APIs sind auf ein CPU-orientiertes Ressourcenmodell und eine Reihe von Renderingvorgängen ausgelegt, die für CPUs gut funktionieren. Dann wird 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 unter umständen nicht in jedem Fall 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 erfordern Renderingvorgänge, die einfach erscheinen, möglicherweise temporäre Zwischenrenderingschritte, die nicht in der API verfügbar gemacht werden und zusätzliche GPU-Ressourcen erfordern.

Direct2D bietet eine direktere Zuordnung zur vollständigen Nutzung der GPU. Sie stellt zwei Kategorien von Ressourcen bereit: geräteunabhängig und geräteabhängig.

  • Geräteunabhängige Ressourcen wie ID2D1Geometrywerden auf der CPU beibehalten.
  • Geräteabhängige Ressourcen wie ID2D1RenderTarget und ID2D1LinearGradientBrushwerden Direktressourcen auf der GPU zugeordnet (wenn hardwarebeschleunigung verfügbar ist). Renderingaufrufe werden ausgeführt, indem Scheitelpunkt- und Abdeckungsinformationen aus einer Geometrie mit Texturinformationen kombiniert werden, die von den geräteabhängigen Ressourcen erzeugt werden.

Wenn Sie geräteabhängige Ressourcen erstellen, werden Systemressourcen (GPU, falls verfügbar oder CPU) beim Erstellen des Geräts zugeordnet und ändern sich nicht von einem Renderingvorgang zu einem anderen. In dieser Situation entfällt die Notwendigkeit eines Ressourcen-Managers. Zusätzlich zu den allgemeinen Leistungsverbesserungen, die durch die Beseitigung eines Ressourcen-Managers erzielt werden, können Sie mit diesem Modell alle Zwischenrenderings 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 sind nie einem Hardwarerenderinggerät zugeordnet. Im Folgenden werden geräteunabhängige Ressourcen angezeigt:

Verwenden Sie eine ID2D1Factory,selbst eine geräteunabhängige Ressource, um geräteunabhängige Ressourcen zu erstellen. (Verwenden Sie zum Erstellen einer Factory 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 dies die CPU.

Um die meisten geräteabhängigen Ressourcen zu erstellen, verwenden Sie ein Renderziel. Verwenden Sie in den meisten Fällen eine Factory, um ein Renderziel zu erstellen.

Im Folgenden sind Beispiele für geräteabhängige Ressourcen aufgeführt:

  • 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 von ihm 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 der gleichen ID2D1Device erstellt werden.

Geräteabhängige Ressourcen werden nicht mehr verwendet, 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, für alle anderen Ressourcen (geräteunabhängig oder geräteabhängig) freigeben, die von derselben Factory erstellt wurden. Beispielsweise können Sie zwei ID2D1RenderTarget-Objekte verwenden, um dieselbe ID2D1RectangleGeometry zu zeichnen, wenn beide ID2D1RenderTarget-Objekte von derselben Factory erstellt wurden.

Die Senkenschnittstellen (ID2D1SimplifiedGeometrySink, ID2D1GeometrySinkund ID2D1TessellationSink) können für Ressourcen freigegeben werden, die von einer beliebigen Factory erstellt wurden. Im Gegensatz zu anderen Schnittstellen in Direct2D kann jede Implementierung einer Senkenschnittstelle verwendet werden. Beispielsweise können Sie Ihre eigene Implementierung von ID2D1SimplifiedGeometrySink verwenden.

Freigeben von Renderzielressourcen

Die Möglichkeit 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 _ _ _ DEFAULTerstellen, 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 liegt daran, dass Sie nicht wissen, welches Gerät das Renderziel am Ende verwendet– es könnte zu einem Rendering auf lokaler Hardware, Software oder auf der Hardware eines Remoteclients führen. Sie können z. B. ein Programm schreiben, das nicht mehr funktioniert, wenn es remote angezeigt wird oder wenn das Renderziel größer als die maximale Größe ist, 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.

Hardwarerenderziele

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 Verwendungsflag D2D1 _ RENDER TARGET USAGE FORCE BITMAP _ _ _ _ _ REMOTING oder D2D1 _ RENDER TARGET USAGE _ _ _ GDI _ COMPATIBLE verwenden oder wenn kein Flag 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 einem oder mehreren 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 fest, die Sie zum Erstellen des Renderziels verwendet haben, auf D2D1 _ RENDER TARGET TYPE _ _ _ HARDWARE.

DXGI– Renderziele für die Oberfläche

Sie können ressourcen, die von einem DXGI-Oberflächenrenderingziel erstellt wurden, für jedes andere DXGI-Oberflächenrenderingziel freigeben, das das gleiche 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 von den beiden Renderzielen gemeinsam genutzt werden kann, die im Methodenaufruf angegeben sind, wenn die Methode erfolgreich ist. Diese Methode ist erfolgreich, solange die beiden Renderziele das gleiche zugrunde liegende Gerät für das Rendering verwenden.