Share via


Grundlegende Konzepte

Hinweis

Für Apps auf Windows 10 wird die Verwendung von Windows.UI.Composition-APIs anstelle von DirectComposition empfohlen. Weitere Informationen finden Sie unter Modernisieren Ihrer Desktop-App mithilfe der visuellen Ebene.

Dieses Thema bietet eine Übersicht über die grundlegenden Konzepte von Microsoft DirectComposition. Sie enthält die folgenden Abschnitte:

Zusammensetzung

DirectComposition definiert eine Komposition als Sammlung von Bitmaps, die kombiniert und bearbeitet werden, indem verschiedene Transformationen, Effekte und Animationen angewendet werden, um ein visuelles Ergebnis in einer Anwendungsoberfläche zu erzeugen. DirectComposition funktioniert nur mit Bitmapinhalten. Vektoren oder Text werden nicht unterstützt. DirectComposition stellt keinen Bitmapinhalt bereit. Stattdessen bietet es Schnittstellen, in denen Benutzer mit D2D, DXGI zeichnen oder ihre eigenen Texturinhalte hochladen können.

Eine DirectComposition-Anwendung erstellt zwei Sätze von Objekten, um eine Szene zu erstellen: Bitmaps, die zusammen zusammengesetzt sind, und Visuals, die die räumlichen Beziehungen zwischen den Bitmaps definieren. Weitere Informationen zu den von DirectComposition unterstützten Bitmapobjekten finden Sie unter Bitmap-Objekte.

Visuals

Visuals (oder visuelle Objekte) sind die grundlegenden Elemente von DirectComposition. Dies sind die grundlegenden Bausteine, die Sie zum Erstellen von Kompositionen und Animationen in Ihrer Anwendungsoberfläche verwenden.

In Programmierbegriffen ist ein Visual ein Objekt mit einer Reihe von Eigenschaften und macht eine Schnittstelle verfügbar, die Sie zum Festlegen des Werts der Eigenschaften verwenden. Die Content-Eigenschaft eines Visuals verknüpft eine bestimmte Bitmap mit dem Visual, während andere Eigenschaften steuern, wie DirectComposition das Visual positioniert und bearbeitet, während es auf dem Bildschirm gerendert wird.

Weitere Informationen finden Sie unter Eigenschaften eines Visuals.

Visuelle Struktur

DirectComposition erstellt eine Komposition aus einer hierarchischen Auflistung visueller Objekte, die als visuelle Struktur bezeichnet werden. Das Visual am Stamm einer Struktur wird als Stammvisual bezeichnet und kann ein oder mehrere untergeordnete Visuals zugeordnet sein. Ein untergeordnetes Visual kann über ein oder mehrere untergeordnete Visuals verfügen. Jedes Visual mit zugeordneten untergeordneten Visuals wird als übergeordnetes Visual bezeichnet, und alle untergeordneten Visuals, die dasselbe übergeordnete Element nutzen, werden als gleichgeordnete Visuals bezeichnet. Ein bestimmtes Visual wird zusammen mit allen untergeordneten und untergeordneten Visuals als visuelle Unterstruktur bezeichnet.

Die Position eines Visuals in der Struktur hilft dabei, die Bildschirmposition und die Z-Reihenfolge relativ zu den anderen Visuals in der Komposition zu bestimmen. Das Stammvisual wird relativ zur linken oberen Ecke des Clientbereichs des Zielfensters positioniert, in dem die Komposition gerendert wird. Alle untergeordneten Visuals werden relativ zur linken oberen Ecke ihres übergeordneten Visuals (oder des durch die TransformParent-Eigenschaft angegebenen Visuals) positioniert und werden immer in z-Reihenfolge vor dem übergeordneten Element angezeigt.

Die folgende Abbildung zeigt eine Komposition von Visuals und die Struktur der visuellen Struktur, die zum Erstellen der Komposition verwendet wird. Visual 1 ist das Stammvisual und ist auch das übergeordnete Element der untergeordneten Visuals 2 und 3, bei denen es sich um gleichgeordnete Visuals handelt. Visual 3 verfügt über zwei eigene untergeordnete Visuals, Visuals 4 und 5. Visuals 3 bis 5 bilden zusammen eine visuelle Unterstruktur.

eine Komposition von Visuals und der entsprechenden visuellen Struktur

Ein übergeordnetes Visual verwaltet eine geordnete Liste seiner untergeordneten Visuals. Wenn gleichgeordnete Visuals so positioniert sind, dass sie sich überlappen, legt DirectComposition die Z-Reihenfolge der Geschwister basierend auf der Reihenfolge fest, in der sie in der Untergeordneten Liste des übergeordneten Visuals angezeigt werden. Ein Geschwisterchen, das später in der Liste angezeigt wird, wird vor allen Geschwistern platziert, die weiter oben in der Liste angezeigt werden. Die folgende Abbildung zeigt die Z-Reihenfolge überlappender untergeordneter Visuals.

die Z-Reihenfolge überlappender untergeordneter Visuals

Eigenschaften eines visuellen Objekts

Ein visuelles Objekt macht eine Reihe von Eigenschaften verfügbar, mit denen Sie den Bitmapinhalt für das Visual festlegen und steuern können, wie DirectComposition den visuellen Inhalt positioniert und bearbeitet. In den folgenden Abschnitten werden die einzelnen Eigenschaften ausführlich beschrieben.

Inhaltseigenschaft

Die Content-Eigenschaft eines Visuals gibt den Bitmapinhalt an, der dem Visual zugeordnet ist. Dies ist die Bitmap, die DirectComposition verwendet, wenn Sie das Visual in eine Komposition einschließen.

Sie legen die Content-Eigenschaft eines Visuals fest, indem Sie die IDCompositionVisual::SetContent-Methode aufrufen.

Weitere Informationen zu den Typen von Bitmapinhalten, die von DirectComposition unterstützt werden, finden Sie unter Bitmap-Objekte.

Clip-Eigenschaft

Die Clip-Eigenschaft eines Visuals gibt einen rechteckigen Bereich an, der als Beschneidungsbereich (oder Cliprechteck) bezeichnet wird. Wenn ein Visual gerendert wird, wird nur der Teil des Visuals angezeigt, der innerhalb des Beschneidungsbereichs liegt, während alle Inhalte, die sich außerhalb des Abschneidebereichs erstrecken, abgeschnitten werden (d. a. nicht angezeigt). DirectComposition unterstützt Abschneidebereiche mit abgerundeten oder eckigen Ecken.

Sie legen die Clip-Eigenschaft eines Visuals fest, indem Sie die IDCompositionVisual::SetClip-Methode aufrufen.

Weitere Informationen finden Sie unter Ausschneiden.

BorderMode-Eigenschaft

Die BorderMode-Eigenschaft gibt an, wie die Kanten von Bitmaps und Clips, die diesem Visual zugeordnet sind, oder mit Visuals in der Unterstruktur, die in diesem Visual verwurzelt sind, erstellt werden.

Der Rahmenmodus wirkt sich darauf aus, wie die Kanten einer Bitmap zusammengesetzt werden, wenn die Bitmap transformiert wird, sodass die Kanten nicht mit ganzzahligen Koordinaten ausgerichtet sind. Es wirkt sich auch darauf aus, wie Inhalte an den Ecken eines Clips mit abgerundeten Ecken und am Rand eines Clips abgeschnitten werden, der so transformiert wird, dass die Kanten nicht mit ganzzahligen Koordinaten ausgerichtet sind.

Weitere Informationen finden Sie unter IDCompositionVisual::SetBorderMode.

BitmapInterpolationMode-Eigenschaft

Die BitmapInterpolationMode-Eigenschaft teilt DirectComposition mit, wie eine Bitmap erstellt wird, wenn sie transformiert wird, sodass es keine 1:1-Korrespondenz zwischen Pixeln in der Bitmap und Pixeln auf dem Bildschirm gibt.

Sie legen die BitmapInterpolationMode-Eigenschaft eines Visuals fest, indem Sie die IDCompositionVisual::SetBitmapInterpolationMode-Methode aufrufen.

CompositeMode-Eigenschaft

Die CompositeMode-Eigenschaft teilt DirectComposition mit, wie der Bitmapinhalt eines Visuals mit dem Renderziel kombiniert wird. Eine Beschreibung der unterstützten zusammengesetzten Modi finden Sie unter DCOMPOSITION_COMPOSITE_MODE.

Sie legen die CompositeMode-Eigenschaft eines Visuals fest, indem Sie die IDCompositionVisual::SetCompositeMode-Methode aufrufen.

OffsetX- und OffsetY-Eigenschaften

Die OffsetX- und OffsetY-Eigenschaften weisen DirectComposition an, wo ein Visual horizontal und vertikal positioniert werden soll. Sie definieren die zweidimensionale feste Position, aus der alle Transformationen und Effekte für das Visual berechnet werden.

Bei einem Stammvisual definieren die Eigenschaften OffsetX und OffsetY die x-Koordinate und die y-Koordinate eines Punkts relativ zur oberen linken Ecke des Fensters, in dem das Visual gehostet wird. Bei einem untergeordneten Visual sind die Koordinaten relativ zur oberen linken Ecke des übergeordneten Elements oder, wenn die TransformParent-Eigenschaft angegeben wird, der oberen linken Ecke des angegebenen Visuals. Wenn ein Visual gerendert wird, wird es so positioniert, dass die obere linke Ecke des Visuals mit den angegebenen Koordinaten übereinstimmt.

Sie legen die OffsetX- und OffsetY-Eigenschaften eines Visuals fest, indem Sie die Methoden IDCompositionVisual::SetOffsetX und SetOffsetY aufrufen.

Effect-Eigenschaft

Mit der Effect-Eigenschaft können Sie einen Effekt oder eine Gruppe von Effekten angeben, die die Komposition eines Visuals und seiner Unterstruktur ändern. Sie können beispielsweise Effekte angeben, die die Deckkraft eines Visuals steuern, das Visual auf unterschiedliche Weise mit einer anderen Bitmap mischen und perspektivische Transformationen auf das Visual anwenden.

Sie legen die Effect-Eigenschaft eines Visuals fest, indem Sie die IDCompositionVisual::SetEffect-Methode aufrufen.

Weitere Informationen finden Sie unter Effekte.

Transform-Eigenschaft

Die Transform-Eigenschaft gibt eine zweidimensionale (2D)-Transformation oder eine Gruppe von 2D-Transformationen an, die DirectComposition für das Visual ausführen soll. Eine Transformation (oder Transformation) ist ein Vorgang, der das Koordinatensystem eines Visuals relativ zum übergeordneten Element oder relativ zum durch die TransformParent-Eigenschaft angegebenen Visual ändert. Sie können Transformationen verwenden, um die Position, Größe oder Natur eines Visuals zu ändern, indem Sie es an eine andere Position verschieben (Übersetzung), vergrößern oder verkleinern (Skalieren), Drehen (Drehung), Verzerren seiner Form (Drehung) usw.

Sie legen die Transform-Eigenschaft eines Visuals fest, indem Sie die IDCompositionVisual::SetTransform-Methode aufrufen.

Weitere Informationen finden Sie unter Transformationen.

TransformParent-Eigenschaft

Das Koordinatensystem eines Visuals wird durch die Eigenschaften OffsetX, OffsetY und Transform geändert. Normalerweise definieren diese Eigenschaften das Koordinatensystem eines Visuals relativ zum unmittelbaren übergeordneten Element. Verwenden Sie die TransformParent-Eigenschaft, um ein anderes Visuelles als das übergeordnete Element als Grundlage für das Koordinatensystem eines untergeordneten Visuals zu verwenden, um ein anderes Visual als "übergeordnetes Element" für Transformationszwecke anzugeben.

Sie legen die TransformParent-Eigenschaft eines Visuals fest, indem Sie die IDCompositionVisual::SetTransformParent-Methode aufrufen.

Geräteobjekt

Um DirectComposition zu verwenden, müssen Sie eine Vielzahl von COM-Objekten (Component Object Model) erstellen und bearbeiten. Das erste Objekt, das Sie erstellen müssen, ist das DirectComposition-Geräteobjekt , da es als Factory zum Erstellen aller anderen Objekte dient, die in einer Komposition verwendet werden.

Sie erstellen ein Geräteobjekt, indem Sie die DCompositionCreateDevice-Funktion aufrufen, die einen IDCompositionDevice-Schnittstellenzeiger zurückgibt. Diese Schnittstelle macht eine Reihe von Methoden verfügbar, die Sie zum Erstellen von visuellen Objekten, Clip-Objekten, Animationsobjekten, Transformieren von Objekten, Effektobjekten usw. verwenden.

Das Geräteobjekt dient einem anderen Zweck, als eine Factory zum Erstellen anderer Objekte zu sein. Es macht eine Methode namens Commit verfügbar, die eine visuelle Struktur zur Verarbeitung an DirectComposition übergibt. Weitere Informationen finden Sie unter Transaktionskomposition.

Beachten Sie, dass Sie zwar mehrere Instanzen des Geräteobjekts in Ihrer Anwendung erstellen können, aber alle Objekte, die Sie in einer bestimmten Komposition verwenden, vom gleichen Geräteobjekt erstellt werden müssen – mit einer Ausnahme: Sie können visuelle Objekte aus verschiedenen Geräteobjekten in derselben visuellen Struktur kombinieren. Wenn Sie dies tun, behandelt DirectComposition die visuelle Struktur wie gewohnt, mit der Ausnahme, dass Änderungen an einem bestimmten visuellen Objekt in der Struktur nur wirksam werden, wenn die Commit-Methode für das Geräteobjekt aufgerufen wird, das das visuelle Objekt erstellt hat.

Die Möglichkeit, Visuals von verschiedenen Geräten in derselben visuellen Struktur zu verwenden, ermöglicht es mehreren Threads, eine einzelne visuelle Struktur zu erstellen und zu bearbeiten, während zwei unabhängige Geräte beibehalten werden, die zum asynchronen Commit von Änderungen verwendet werden können. Weitere Informationen finden Sie unter Geräteübergreifende visuelle Strukturen.

Kompositionszielfenster

Eine visuelle Struktur muss an ein Fenster gebunden sein, bevor visuals der Struktur auf dem Bildschirm angezeigt werden können. Das Als Kompositionszielfenster bezeichnete Fenster kann ein Fenster auf oberster Ebene oder ein untergeordnetes Fenster sein. Außerdem kann das Kompositionszielfenster ein mehrstufiges Fenster sein. Das heißt, sie kann das WS_EX_LAYERED Fensterformat aufweisen.

DirectComposition ermöglicht es einer Anwendung, maximal zwei visuelle Strukturen an jedes Fenster zu binden. Die visuellen Strukturen enthalten eine Struktur, die sich über dem Fenster selbst, aber hinter allen untergeordneten Fenstern des Fensters zusammensetzt, und eine andere, die über dem Fenster und über den untergeordneten Fenstern zusammengesetzt ist. Anders ausgedrückt: Jedes Fenster verfügt über vier konzeptionelle Ebenen, und alle Ebenen werden in den sichtbaren Bereich des Zielfensters zugeschnitten. Die folgende Abbildung zeigt die vier konzeptionellen Ebenen eines Fensters.

die konzeptionellen Ebenen eines Fensters

Transaktionskomposition

DirectComposition verwendet ein Transaktionsmodell, bei dem Sie einen Batchsatz von Änderungen an einem Visual erstellen und dann den Satz auf DirectComposition zur Verarbeitung auf einmal "committen". Sie können das gleiche DirectComposition-visual-Objekt ändern und die Änderungen beliebig oft committen. Wenn der Desktopfenster-Manager (DWM) Batches aufnimmt, übernimmt er alle ausstehenden Batches und wendet sie in der Reihenfolge, in der sie committet wurden, auf den nächsten Frame an.

Alle Änderungen innerhalb eines einzelnen Commits werden garantiert auf einen einzelnen Frame angewendet. Da DWM Batches einmal pro Frame sammelt, können Sie ein bestimmtes Objekt nur einmal pro Frame ändern. Nachfolgende Commits, die verschiedene Objekte ändern, können möglicherweise auch auf den aktuellen Frame angewendet werden, aber DirectComposition garantiert nicht, dass die Änderungen im selben Frame auftreten.

Mit den Methoden IDCompositionSurface::BeginDraw und IDCompositionSurface::EndDraw können Sie Renderingupdates mit visuellen Updates synchronisieren. Beispielsweise können Sie IDCompositionSurface::BeginDraw aufrufen, die OffsetX- und Clip-Eigenschaften eines Visuals aktualisieren, IDCompositionDevice::Commit aufrufen, Inhalte mit Microsoft DirectX zeichnen und dann IDCompositionSurface::EndDraw aufrufen. In diesem Fall stellt Microsoft DirectComposition sicher, dass Bitmapinhalte und die visuellen Eigenschaften gleichzeitig aktualisiert werden.

Batching

Sie können mehrere Änderungen an demselben Visual oder mehrere Änderungen an verschiedenen Visuals innerhalb desselben Frames committen. Wenn Sie mehrere Änderungen an demselben Visual innerhalb desselben Frames vornehmen, sollten Sie die folgenden Punkte berücksichtigen:

  • Wenn Sie mehrere Änderungen an derselben Eigenschaft eines Visuals vornehmen, wird nur die letzte Änderung angewendet. Wenn Sie beispielsweise die Deckkraft auf 0, dann auf 0,5 und schließlich auf 1,0 festlegen, wird nur eine Deckkraft von 1,0 auf das Visual angewendet.

  • Wenn Sie mehrere Eigenschaften desselben Visuals ändern, wendet DirectComposition die Änderungen zuerst auf das Visual und dann auf alle untergeordneten Visuals an. Die Eigenschaften werden unabhängig von der Reihenfolge, in der Sie sie angeben, in der folgenden Reihenfolge angewendet:

    1. Offset
    2. Transformieren
    3. Abschneiden
    4. Auswirkung

    Die folgende Abbildung zeigt das Ergebnis der Anwendung aller vier Eigenschaften auf ein Visual.

    Ergebnis des Anwendens aller vier Eigenschaften auf ein Visual

    Denken Sie daran, dass alle Änderungen gleichzeitig im Kontext desselben Frames auf das Visual angewendet werden. Dies bedeutet, dass die Änderungen am Visual aus Sicht des Benutzers sofort auftreten.

  • Für die Transform-Eigenschaft können Sie IDCompositionDevice::CreateTransformGroup verwenden, um eine Gruppe von Transformationen zu erstellen, die alle gleichzeitig auf ein Visual angewendet werden. DirectComposition wendet die Transformationen in der von Ihnen angegebenen Reihenfolge an.

  • Für die Effect-Eigenschaft können Sie IDCompositionEffectGroup verwenden, um eine Gruppe von Effekten anzuwenden. DirectComposition wendet die Effekte in der von Ihnen angegebenen Reihenfolge an. Darüber hinaus führen 3D-Perspektiventransformationen zu einer Vereinfachung der visuellen Struktur, nachdem alle 3D-Transformationen im aktuellen Visual angewendet wurden. Dadurch wird sichergestellt, dass das resultierende Visual so nah wie möglich an 3D aussieht.

Synchronization

Ihre Anwendung kann DirectComposition aus mehreren Threads gleichzeitig aufrufen. Die Ausführungsreihenfolge ist für sequenzielle Aufrufe garantiert, jedoch nicht für gleichzeitige Aufrufe. Wenn Beispielsweise Thread A ein Visual ändert und Thread B den Batch gleichzeitig committet, wird nicht definiert, ob diese visuelle Änderung im committeten Batch enthalten ist oder ob ein neuer Batch gestartet wird. Wenn Ihre Anwendung jedoch andere Synchronisierungsmechanismen verwendet, um sicherzustellen, dass eine Methode vor der anderen aufgerufen wird, berücksichtigt DirectComposition die Aufrufreihenfolge und verarbeitet sie so, als ob beide Aufrufe in dieser Reihenfolge von einem einzelnen Thread ausgegeben würden.

Geräteübergreifende visuelle Strukturen

DirectComposition-Objekte sind nicht threadgebunden; Sie können mehrere Threads verwenden, um denselben Satz von Objekten zu ändern. Beachten Sie jedoch die folgenden Probleme, wenn Sie dasselbe Geräteobjekt gemeinsam nutzen.

  • Beide Threads müssen IDCompositionDevice::Commit aufrufen können. Wenn nur einer der Threads IDCompositionDevice::Commit aufruft, kann der andere Thread keine seiner Änderungen an DirectComposition committen.
  • Das Transaktionsverhalten kann verloren gehen, wenn ein Thread IDCompositionDevice::Commit aufruft , während der andere Thread noch Änderungen vornimmt, die Teil derselben Transaktion sein sollen.

Wenn Sie mehrere gleichzeitige Transaktionen in DirectComposition committen müssen, müssen Sie mehrere Geräteobjekte verwenden, möglicherweise aus mehreren Threads. In diesem Szenario wird dieselbe visuelle Struktur von beiden Geräteobjekten gemeinsam verwendet, und jedes Geräteobjekt führt einen Commit für seine eigenen Transaktionen durch.

Die folgende Abbildung zeigt eine visuelle Struktur, die von zwei Geräteobjekten gemeinsam genutzt wird. Visuals 1, 2, 4 und 5 gehören einem Gerät oder dem anderen, aber Visual 3 wird von beiden Geräten gemeinsam genutzt und kann daher verwendet werden, um zwei Untergeordnete Strukturen in einer einzelnen, größeren visuellen Struktur zu verbinden. Durch die Freigabe der visuellen Struktur können die beiden Geräte asynchron aus zwei verschiedenen Threads bearbeitet werden.

eine visuelle Struktur, die von zwei Geräten gemeinsam genutzt wird

Um die Nützlichkeit der Freigabe einer visuellen Struktur zwischen zwei Geräten zu veranschaulichen, sollten Sie eine Architektur in Betracht ziehen, die Toucheingaben mit geringer Latenz ermöglicht. Die Architektur könnte zwei Threads verwenden, einen, der die meisten Ui-Aufgaben verarbeitet, und einen zweiten Thread, der für die Verarbeitung von Toucheingabeereignissen vorgesehen ist. Der Touchthread aktualisiert die Transformation eines bestimmten Visuals basierend auf der Benutzereingabegeste. Durch Aktualisieren der Transformation kann der Touchthread die gesamte Unterstruktur unter diesem Visual dem Finger des Benutzers folgen, hoch- oder herunterskalieren, während der Benutzer eine Multitouch-Geste ausführt usw. Der UI-Thread behält den Besitz des großteils der Kompositionsstruktur, wobei der Touchthread nur die wenigen Visuals besitzt, die für die asynchrone Touchantwort gekennzeichnet sind. Die folgende Abbildung zeigt eine vereinfachte Version einer solchen Kompositionsstruktur:

eine visuelle Struktur, die von einem Ui-Thread und einem Touchthread gemeinsam genutzt wird

In der Regel ändert der UI-Thread nur die Visuals, die er exklusiv besitzt, und der Touchthread ändert nur das freigegebene Visual. Die einzige Ausnahme tritt beim Erstellen oder Zerstören einer Toucheingabe-aktivierten Teilstruktur auf.

IDCompositionSurface::BeginDraw

IDCompositionSurface::EndDraw

IDCompositonDevice::Commit

DirectComposition-Konzepte