Freigeben über


Architektur und Komponenten

Anmerkung

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

In diesem Thema werden die Komponenten beschrieben, aus denen Microsoft DirectComposition besteht. Sie besteht aus den folgenden Abschnitten.

Softwarekomponenten

DirectComposition besteht aus den folgenden Hauptsoftwarekomponenten.

  • Eine Benutzermodusanwendungsbibliothek (dcomp.dll), die die com-basierte öffentliche API (Component Object Model) implementiert.
  • Ein Kompositionsmodul für den Benutzermodus (dwmcore.dll), das im DwM-Prozess (Desktop Window Manager) gehostet wird (dwm.exe), und führt die eigentliche Desktopkomposition aus.
  • Eine Kernelmodusobjektdatenbank (Teil von win32k.sys), die Befehle von der Anwendung an das Kompositionsmodul marshallen.

Eine einzelne Instanz des Kompositionsmoduls behandelt die DirectComposition-Kompositionsstrukturen für alle Anwendungen und die DWM-Kompositionsstruktur, die den gesamten Desktop darstellt. Sowohl die Kernelmodusobjektdatenbank als auch das Kompositionsmodul für den Benutzermodus werden einmal pro Sitzung instanziiert, sodass ein Terminalservercomputer mit mehreren Benutzern über mehrere Instanzen dieser Komponenten verfügt.

Das folgende Diagramm zeigt die wichtigsten DirectComposition-Komponenten und deren Beziehung zueinander.

Architektur auf oberster Ebene

Anwendungsbibliothek

Die DirectComposition-Anwendungsbibliothek ist eine öffentliche COM-basierte API mit einem einzelnen flachen Einstiegspunkt, der aus dcomp.dll exportiert wird und einen Schnittstellenzeiger auf ein Geräteobjekt zurückgibt. Das Geräteobjekt verfügt wiederum über Methoden zum Erstellen aller anderen Objekte, die jeweils durch einen Schnittstellenzeiger dargestellt werden. Alle DirectComposition-Schnittstellen erben und implementieren die IUnknown--Schnittstelle vollständig. Alle Methoden, die DirectComposition-Schnittstellen akzeptieren, überprüfen, ob die Schnittstelle in dcomp.dll implementiert wird oder ob sie von einer anderen Komponente implementiert wird. Da DirectComposition nicht erweiterbar ist, geben Methoden, die Schnittstellen als Parameter verwenden, E_INVALIDARG zurück, wenn die Schnittstellen nicht in dcomp.dllimplementiert werden. Die API erfordert keine speziellen Berechtigungen; sie kann von Prozessen aufgerufen werden, die auf der niedrigsten Zugriffsebene ausgeführt werden. Da die API jedoch nicht in Sitzung 0 ausgeführt wird, ist sie nicht für Dienste geeignet. In dieser Hinsicht ähnelt die DirectComposition-API anderen Microsoft DirectX-APIs, insbesondere Direct2D, Microsoft Direct3D und Microsoft DirectWrite.

Da das Kompositionsmodul ausschließlich für die asynchrone Ausführung entwickelt wurde, sind Objekteigenschaften in der DirectComposition-API schreibgeschützt. Alle Eigenschaften haben Settermethoden, aber keine Getter-Methoden. Das Lesen von Eigenschaften ist nicht nur ressourcenintensiv, sondern kann auch ungenau sein, da jeder Wert, den das Kompositionsmodul zurückgibt, sofort ungültig werden kann. Dies kann passieren, wenn beispielsweise eine unabhängige Animation an die zu lesende Eigenschaft gebunden ist.

Die API ist threadsicher. Eine Anwendung kann jederzeit eine beliebige Methode von jedem Thread aufrufen. Da jedoch viele API-Methoden in einer bestimmten Sequenz aufgerufen werden müssen, kann eine Anwendung abhängig davon, wie die Threads interleave, unvorhersehbares Verhalten aufweisen. Wenn z. B. zwei Threads dieselbe Eigenschaft desselben Objekts auf unterschiedliche Werte gleichzeitig ändern, kann die Anwendung nicht vorhersagen, welche der beiden Werte der Endwert der Eigenschaft sein werden. Wenn zwei Threads Commit- auf demselben Gerät aufrufen, erhält kein Thread tatsächlich transaktionsales Verhalten, da ein Aufruf von Commit- in einem Thread den Batch aller Befehle sendet, die von beiden Threads ausgegeben werden, nicht nur die, die Commitaufgerufen hat.

Das System verwaltet den gesamten internen Zustand pro Geräteobjekt. Wenn eine Anwendung zwei oder mehr DirectComposition-Geräteobjekte erstellt, kann die Anwendung unabhängige Batches und anderen Zustand zwischen den beiden verwalten.

Alle DirectComposition-Objekte verfügen über Geräteobjektaffinität; Objekte, die von einem bestimmten Geräteobjekt erstellt wurden, können nur mit diesem Geräteobjekt verwendet werden und können nur anderen Objekten zugeordnet werden, die vomselben Geräteobjekt erstellt wurden. Mit anderen Worten, jedes Geräteobjekt ist eine separate nicht zusammenhängende Insel der Funktionalität. Die einzige Ausnahme ist die visuelle Klasse, die das Erstellen visueller Strukturen zulässt, bei denen ein visuelles Element zu einem anderen Geräteobjekt gehören kann als das übergeordnete Objekt. Dies ermöglicht Szenarien, in denen eine Anwendung und ein Steuerelement eine einzelne Kompositionsstruktur verwalten können, ohne auch ein einzelnes DirectComposition-Geräteobjekt freigeben zu müssen.

Kompositionsmodul

Das DirectComposition-Kompositionsmodul wird auf einem dedizierten Prozess ausgeführt, getrennt von jedem Anwendungsprozess. Ein einzelner Kompositionsprozess, dwm.exe, unterstützt jede Anwendung in einer Sitzung. Jede Anwendung kann zwei visuelle Strukturen für jedes Fenster erstellen, das sie besitzt. Alle Bäume werden tatsächlich als Unterstrukturen einer größeren visuellen Struktur implementiert, die auch die Kompositionsstrukturen von DWM umfasst. Der DWM erstellt eine große visuelle Struktur für jeden Desktop in einer Sitzung. Dies sind die wichtigsten Vorteile dieser Architektur:

  • Das Kompositionsmodul hat Zugriff auf alle Anwendungsbitmaps und visuellen Strukturen, die prozessübergreifende Fensterinteroperabilität und -komposition ermöglichen.
  • Das Kompositionsmodul wird in einem vertrauenswürdigen Systemprozess ausgeführt, der von jedem Anwendungsprozess getrennt ist, sodass Anwendungen mit geringen Zugriffsrechten geschützten Inhalten sicher verfassen können.
  • Das Kompositionsmodul kann erkennen, wann ein bestimmtes Fenster vollständig verdeckt ist, und verhindern, dass CPU- und Grafikverarbeitungseinheitsressourcen (GPU) für das Fenster verworren werden.
  • Das Kompositionsmodul kann direkt in den Hintergrundpuffer des Bildschirms verfassen, sodass keine zusätzliche Kopie erforderlich ist, die für Prozesskompositionsmodule erforderlich ist.
  • Alle Anwendungen nutzen ein einzelnes Direct3D-Gerät für die Komposition, das erhebliche Speichereinsparungen bietet.

Die visuelle Struktur ist eine beibehaltene Struktur. Die DirectComposition-API macht Methoden zum Bearbeiten der Struktur in Batches von Änderungen verfügbar, die atomisch verarbeitet werden. Das Stammobjekt in der DirectComposition-API ist das Geräteobjekt, das als Factory für alle anderen DirectComposition-Objekte dient und eine Methode mit dem Namen Commitenthält. Das Kompositionsmodul enthält keine Änderungen, die die Anwendung an der visuellen Struktur vornimmt, bis die Anwendung Commit-aufruft, wobei alle Änderungen seit dem letzten Commit- als einzelne Transaktion verarbeitet werden.

Die Anforderung, Commit- aufzurufen, ähnelt dem Konzept eines "Frame", mit der Ausnahme, dass das Kompositionsmodul asynchron ausgeführt wird, mehrere verschiedene Frames zwischen Aufrufen von Commitdarstellen kann. In DirectComposition ist ein Frame- eine einzelne Iteration des Kompositionsmoduls, und das Intervall, das von einer Anwendung zwischen zwei Aufrufen von Commit- ausgegeben wird, wird als Batch-bezeichnet.

DirectComposition batches alle Anwendungsaufrufe an die DirectComposition-API. Die Kernelobjektdatenbank, die im win32k.sys Sitzungstreiber implementiert ist, speichert alle Statusinformationen, die den API-Aufrufen zugeordnet sind.

Das Kompositionsmodul erzeugt einen Frame für jede vertikale Leere im Display. Der Frame wird an einem vertikalen Leerzeichen gestartet und zielt auf den nachfolgenden vertikalen Leerzeichen ab. Wenn der Frame gestartet wird, nimmt das Kompositionsmodul alle ausstehenden Batches auf und enthält deren Befehle in diesem Frame. Batches werden in einer ausstehenden Warteschlange platziert, wenn die Anwendung Commitaufruft und die ausstehende Warteschlange am Anfang des Frames atomar geleert wird. Daher gibt es einen einzelnen Zeitpunkt, der den Anfang eines Frames markiert. Alle vor diesem Punkt übermittelten Batches sind im Frame enthalten, während alle nach dem Senden übermittelten Batches warten müssen, bis der nächste Frame verarbeitet wird. Die vollständige Kompositionsschleife lautet wie folgt:

  1. Schätzen Sie die Zeit des nächsten vertikalen Leerzeichens.
  2. Rufen Sie alle ausstehenden Batches ab.
  3. Verarbeiten der abgerufenen Batches.
  4. Aktualisieren Sie alle Animationen mithilfe der in Schritt 1 geschätzten Zeit.
  5. Bestimmen Sie die Bereiche des Bildschirms, die neu zusammengesetzt werden müssen.
  6. Erstellen Sie die geänderten Bereiche erneut.
  7. Präsentieren Sie den Frame, indem Sie die Hintergrund- und Frontpuffer für jeden Bildschirm kippen.
  8. Wenn nichts verfasst und in den Schritten 6 und 7 dargestellt wurde, warten Sie, bis ein Batch zugesichert wurde.
  9. Warten Sie auf das nächste vertikale Leerzeichen.

Wenn mehrere Monitore an einen einzelnen Grafikkarte angeschlossen sind, verwendet das Kompositionsmodul den vertikalen Leeren des primären Monitors, um die Kompositionsschleife zu steuern und die Animationssamplingzeiten festzulegen. Jeder Monitor wird durch eine separate Flipchain im Vollbildmodus dargestellt. Das Kompositionsmodul wiederholt die Schritte 6 und 7 für jeden Monitor, in einer Roundrobin-Mode, mit einem einzigen Direct3D-Gerät. Wenn auch mehrere Grafikkarten vorhanden sind, verwendet das Kompositionsmodul ein separates Direct3D-Gerät für jeden Grafikkarten in schritt 6 und 7.

Kompositionsframes werden so geplant, dass sie immer in einem vertikalen Leerzeichen beginnen, wie die folgende Abbildung zeigt.

Kompositionsrahmenplanung

Wenn das Kompositionsmodul keine Aufgaben ausführen kann, da sich die Kompositionsstruktur nicht geändert hat, wird der Kompositionsthread während des Wartens auf einen neuen Batch in den Ruhezustand geschlafen. Wenn ein neuer Batch übermittelt wird, wird der Kompositionsthread reaktiviert, aber sofort wieder in den Ruhezustand zurückgesendet, bis die nächste vertikale Leertaste leer ist. Dieses Verhalten stellt vorhersehbare Start- und Endzeiten für Frames für Anwendungen und für das Kompositionsmodul sicher.

Das Kompositionsmodul veröffentlicht die Framepräsentationszeiten und die aktuelle Bildfrequenz. Durch das Veröffentlichen dieser Informationen können Anwendungen die Präsentationszeit für ihre eigenen Batches abschätzen, wodurch Animationen wiederum synchronisiert werden können. Insbesondere kann eine Anwendung eine Kombination aus Framestatistiken aus dem Kompositionsmodul und ein historisches Modell der Dauer des UI-Threads verwenden, um die Samplingzeit für eigene Animationen zu bestimmen.

Beispielsweise kann die Anwendung am Anfang des Anwendungsbatches, der in der vorherigen Abbildung gezeigt wird, das Kompositionsmodul abfragen, um die genaue Darstellungszeit des nächsten Frames zu bestimmen. Die Anwendung kann dann die aktuelle Uhrzeit zusammen mit Informationen zu früheren batches verwenden, die sie produziert hat, um zu bestimmen, ob die Anwendung den aktuellen Batch vor dem nächsten vertikalen Leerzeichen abschließen kann. Daher verwendet die Anwendung die Framepräsentationszeit als Samplingzeit für eigene Animationen. Wenn die Anwendung feststellt, dass ihre Arbeit in der aktuellen vertikalen Leertaste nicht abgeschlossen werden kann, kann die Anwendung stattdessen die nachfolgende Framezeit als Samplingzeit verwenden, indem sie die vom Kompositionsmodul zurückgegebenen Bildfrequenzinformationen verwendet, um diese Zeit zu berechnen.

DirectComposition-Konzepte