Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Eine Direct2D-Ressource ist ein Objekt, das zum Zeichnen verwendet wird und durch eine Direct2D-Schnittstelle dargestellt wird, wie ID2D1Geometry oder ID2D1RenderTarget. Dieses Thema beschreibt die Arten von Direct2D-Ressourcen und wie sie gemeinsam genutzt werden können.
Dieses Thema enthält die folgenden Abschnitte:
- Über Direct2D Ressourcen
- Geräteunabhängige Ressourcen
- Geräteabhängige Ressourcen
- Gemeinsame Nutzung von Factoryressourcen
- Gemeinsame Nutzung von Renderzielressourcen
Über Direct2D Ressourcen
Viele hardwarebeschleunigte 2D-APIs sind auf ein CPU-fokussiertes Ressourcenmodell und eine Reihe von Rendering-Operationen ausgelegt, die auf CPUs gut funktionieren. Die Implementierung dieser APIs erfordert einen Ressourcenmanager für die Zuordnung von CPU-Ressourcen zu Ressourcen auf dem Grafikprozessor. Aufgrund von GPU-Beschränkungen können einige Operationen nicht unter allen Umständen beschleunigt werden. In diesen Fällen muss der Ressourcenmanager zwischen CPU und GPU hin und her kommunizieren (was teuer ist), damit er zum CPU-Rendering übergehen kann. In einigen Fällen kann dies dazu führen, dass das Rendering unvorhersehbar vollständig auf die CPU zurückfällt. Darüber hinaus können Rendering-Vorgänge, die einfach erscheinen, temporäre Zwischenschritte erfordern, die nicht in der API enthalten sind und zusätzliche GPU-Ressourcen benötigen.
Direct2D bietet ein direkteres Mapping zur vollen Nutzung des Grafikprozessors. Es bietet zwei Kategorien von Ressourcen: geräteunabhängige und geräteabhängige.
- Geräteunabhängige Ressourcen, wie ID2D1Geometry, werden auf der CPU gehalten.
- Geräteabhängige Ressourcen wie ID2D1RenderTarget und ID2D1LinearGradientBrushwerden direkt auf Ressourcen auf der GPU abgebildet (wenn Hardwarebeschleunigung verfügbar ist). Rendering-Aufrufe werden durch die Kombination von Vertex- und Coverage-Informationen aus einer Geometrie mit Texturierungsinformationen durchgeführt, die von den geräteabhängigen Ressourcen erzeugt werden.
Wenn Sie geräteabhängige Ressourcen erstellen, werden die Systemressourcen (die GPU, falls verfügbar, oder die CPU) bei der Erstellung des Geräts zugewiesen und ändern sich nicht von einem Rendering-Vorgang zum anderen. In dieser Situation ist ein Ressourcenmanager nicht mehr erforderlich. Zusätzlich zu den allgemeinen Leistungsverbesserungen, die sich durch den Wegfall eines Ressourcenmanagers ergeben, 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 kennen und wissen, wann sie zusammen verwendet werden können.
Geräteunabhängige Ressourcen
Wie im vorherigen Abschnitt beschrieben, befinden sich geräteunabhängige Ressourcen immer auf der CPU und sind nie mit einem Hardware-Rendering-Gerät verbunden. Die folgenden Ressourcen sind geräteunabhängig:
- ID2D1DrawingStateBlock
- ID2D1Factory
- ID2D1Geometry und die Schnittstellen, die von ihr erben.
- ID2D1GeometrySink and ID2D1SimplifiedGeometrySink
- ID2D1StrokeStyle
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 Funktion CreateFactory ).
Mit Ausnahme der Rendering-Ziele sind alle Ressourcen, die von einer Factory erstellt werden, geräteunabhängig. Ein Rendering-Ziel ist eine geräteabhängige Ressource.
Geräteabhängige Ressourcen
Jede Ressource, die nicht in der vorherigen Liste aufgeführt ist, ist eine geräteabhängige Ressource. Geräteabhängige Ressourcen sind mit einem bestimmten Rendering-Gerät verbunden. Wenn Hardware-Beschleunigung verfügbar ist, ist dieses Gerät die GPU. In anderen Fällen ist es die CPU.
Um die meisten geräteabhängigen Ressourcen zu erstellen, verwenden Sie ein Rendering-Ziel. In den meisten Fällen verwenden Sie eine Factory, um ein Rendering-Ziel zu erstellen.
Im Folgenden finden Sie Beispiele für geräteabhängige Ressourcen:
- ID2D1Brush und die Schnittstellen, die von ihr erben. Verwenden Sie ein Rendering-Ziel, um Pinsel zu erstellen.
- ID2D1Layer. Verwenden Sie ein Rendering-Ziel, um Ebenen zu erstellen.
- ID2D1RenderTarget und die Schnittstellen, die von ihm erben. Um ein Rendering-Ziel zu erstellen, verwenden Sie eine Factory oder ein anderes Rendering-Ziel.
Hinweis
Ab Windows 8 gibt es neue Schnittstellen, die geräteabhängige Ressourcen erstellen. Ein ID2D1Device und ein ID2D1DeviceContext können sich eine Ressource teilen, wenn der Gerätekontext und die Ressource aus demselben ID2D1Deviceerstellt wurden.
Geräteabhängige Ressourcen werden unbrauchbar, wenn die zugehörigen Rendering-Geräte nicht mehr verfügbar sind. Das bedeutet, wenn Sie den Fehler D2DERR_RECREATE_TARGET für ein Rendering-Ziel erhalten, müssen Sie das Rendering-Ziel und alle seine Ressourcen neu erstellen.
Gemeinsame Nutzung von Fabrikressourcen
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 zum Beispiel zwei ID2D1RenderTarget -Objekte verwenden, um dasselbe ID2D1RectangleGeometry zu zeichnen, wenn beide ID2D1RenderTarget -Objekte von derselben Factory erstellt wurden.
Die Sink-Schnittstellen (ID2D1SimplifiedGeometrySink, ID2D1GeometrySinkund ID2D1TessellationSink) können mit Ressourcen geteilt werden, die von einer beliebigen Fabrik erstellt wurden. Im Gegensatz zu anderen Schnittstellen in Direct2D kann jede Implementierung einer Senkenschnittstelle verwendet werden. Sie könnten zum Beispiel Ihre eigene Implementierung von ID2D1SimplifiedGeometrySinkverwenden.
Gemeinsame Nutzung von Renderzielressourcen
Ob Sie die von einem Rendering-Ziel erstellten Ressourcen gemeinsam nutzen können, hängt von der Art des Rendering-Ziels ab. Wenn Sie ein Rendering-Ziel vom Typ D2D1_RENDER_TARGET_TYPE_DEFAULTerstellen, können die von diesem Rendering-Ziel erstellten Ressourcen nur von diesem Rendering-Ziel verwendet werden (es sei denn, das Rendering-Ziel passt in eine der in den folgenden Abschnitten beschriebenen Kategorien). Dies liegt daran, dass Sie nicht wissen, welches Gerät das Rendering-Ziel letztendlich verwenden wird - es könnte auf lokaler Hardware, Software oder auf der Hardware eines entfernten Clients gerendert werden. Sie könnten zum Beispiel ein Programm schreiben, das nicht mehr funktioniert, wenn es aus der Ferne angezeigt wird oder wenn das Rendering-Ziel über die von der Rendering-Hardware unterstützte Maximalgröße hinaus vergrößert wird.
In den folgenden Abschnitten wird beschrieben, unter welchen Umständen eine von einem Rendering-Ziel erstellte Ressource für ein anderes Rendering-Ziel freigegeben werden kann.
Hardware-Rendering-Ziele
Sie können Ressourcen zwischen allen Rendering-Zielen, die explizit Hardware verwenden, gemeinsam nutzen, solange der Remoting-Modus kompatibel ist. Der Remoting-Modus ist nur dann garantiert kompatibel, wenn beide Render-Targets das Verwendungsflag D2D1_RENDER_TARGET_USAGE_FORCE_BITMAP_REMOTING oder D2D1_RENDER_TARGET_USAGE_GDI_COMPATIBLE verwenden, oder wenn keines der beiden Flags angegeben ist. Diese Einstellungen garantieren, dass sich die Ressourcen immer auf demselben Computer befinden. Um einen Verwendungsmodus festzulegen, setzen Sie das Feld Verwendung der Struktur D2D1_RENDER_TARGET_PROPERTIES , die Sie zum Erstellen des Render-Targets verwendet haben, mit einem oder mehreren D2D1_RENDER_TARGET_USAGE -Flags.
Um ein Rendering-Ziel zu erstellen, das explizit Hardware-Rendering verwendet, setzen Sie das Feld Typ der Struktur D2D1_RENDER_TARGET_PROPERTIES, die Sie zum Erstellen des Rendering-Ziels verwendet haben, auf D2D1_RENDER_TARGET_TYPE_HARDWARE.
DXGI Oberflächen-Rendering-Ziele
Sie können Ressourcen, die von einem DXGI-Surface-Rendering-Ziel erstellt wurden, mit jedem anderen DXGI-Surface-Rendering-Ziel teilen, das dasselbe zugrunde liegende Direct3D-Gerät verwendet.
Kompatible Render-Ziele und gemeinsame Bitmaps
Sie können die Ressourcen zwischen einem Rendering-Ziel und kompatiblen Rendering-Zielen, die von diesem Rendering-Ziel erstellt wurden, gemeinsam nutzen. Um ein kompatibles Renderziel zu erstellen, verwenden Sie die Methode ID2D1RenderTarget::CreateCompatibleRenderTarget .
Sie können die Methode ID2D1RenderTarget::CreateSharedBitmap verwenden, um eine ID2D1Bitmap zu erstellen, die von den beiden Render-Targets, die im Methodenaufruf angegeben sind, gemeinsam genutzt werden kann, wenn die Methode erfolgreich ist. Diese Methode ist erfolgreich, solange die beiden Rendering-Ziele dasselbe zugrunde liegende Gerät für das Rendering verwenden.