Share via


Kompositionsoberfläche

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.

In diesem Thema werden die Arten von Oberflächen beschrieben, die von Microsoft DirectComposition unterstützt werden.

Logische DirectComposition-Oberfläche

DirectComposition macht das IDCompositionSurface-Objekt verfügbar, um eine logische Kompositionsoberfläche darzustellen. DirectComposition macht APIs verfügbar, die Sie zum Erstellen, Aktualisieren und Löschen dieser logischen Oberflächen verwenden können. Jede Oberfläche kann einem oder mehreren Visuals zugeordnet werden. Eine Anwendung ist für die Verwaltung der Lebensdauer logischer Oberflächen verantwortlich.

Aktualisieren einer logischen Oberfläche

Eine Anwendung kann eine logische Oberfläche aktualisieren, indem sie BeginDraw aufruft und die Größe und den Offset des Rechtecks auf der logischen Oberfläche angibt, die die App aktualisieren möchte. DirectComposition ordnet ein Rechteck der angegebenen Größe zu und gibt dann die Oberfläche und den entsprechenden Offset zurück, die die Anwendung zeichnen oder aktualisieren muss. Die Grenzwerte des Updaterechtecks sind durch die Oberflächengröße gebunden. Beispielsweise kann das Updaterechteck für eine Fläche von 40 x 100 Pixeln bis zu (0,0,40,100) betragen. Außerdem wird der aktualisierbare Bereich durch ein waches Rechteck erzwungen. Da jeweils nur ein Schutzrechteck vorhanden sein kann, kann jeweils nur eine logische Oberfläche aktualisiert werden. BeginDraw gibt einen Fehlercode zurück, wenn EndDraw oder SuspendDraw nach einem vorherigen Aufruf von BeginDraw nicht aufgerufen wurde. Eine Anwendung kann einem Batch einen committeten Aufruf von BeginDraw hinzufügen, er wird jedoch erst wirksam, wenn EndDraw aufgerufen und committet wird.

Anhalten von Updates auf einer logischen Oberfläche

Eine Anwendung, die verschiedene Oberflächen aktualisieren muss, kann SuspendDraw für das aktuelle Update aufrufen und dann BeginDraw aufrufen, um ein neues Update zu starten. Microsoft DirectComposition ermöglicht mehrere Updates, aber nur ein Update kann gleichzeitig aktiv sein. Dies bedeutet, dass Sie SuspendDraw oder EndDraw auf einer Oberfläche aufrufen müssen, bevor Sie BeginDraw auf der nächsten Oberfläche aufrufen. Im Gegensatz zu EndDraw kann ein committeter Batch eine Oberfläche enthalten, die sich im SuspendDraw-Zustand befindet, aber solche Updates werden erst auf dem Bildschirm angezeigt, wenn EndDraw aufgerufen wird.

Fortsetzen von Updates auf einer logischen Oberfläche

Eine Anwendung kann ein Update auf einer Oberfläche fortsetzen, die sich im SuspendDraw-Zustand befindet, indem ResumeDraw aufgerufen wird. Diese Methode kann nur auf einer angehaltenen Oberfläche aufgerufen werden.

Beenden von Updates auf einer logischen Oberfläche

Das Aufrufen von EndDraw und Commit ist die einzige Möglichkeit, Bitmapupdateänderungen auf dem Bildschirm anzuzeigen. Jeder Aufruf von EndDraw muss über einen entsprechenden Aufruf von BeginDraw verfügen, um das Wächterrechteck zu entfernen. Die logische Oberfläche behält alle Updates bei, bis Commit aufgerufen wird. Sie können EndDraw auch auf einer Oberfläche aufrufen, die sich im SuspendDraw-Zustand befindet, da EndDraw ein implizierter Resume/End ist. Nachdem Sie EndDraw aufgerufen haben, wird der aktualisierte Inhalt auf dem Bildschirm angezeigt und verworfen, sodass der Speicher für das Update für ein späteres Update wiederverwendet werden kann.

Beispiel für die Verwendung einer logischen Oberfläche

Im folgenden Beispiel werden die Schritte beschrieben, die eine Anwendung ausführen würde, wenn sie eine visuelle Struktur aus zwei Visuals erstellt und dann bestimmte Bereiche der beiden logischen Oberflächen aktualisieren muss, die den Visuals zugeordnet sind:

  1. Erstellen Sie ein DirectComposition-Gerät.
  2. Erstellen Sie die visuelle Struktur, die aus einem Stammknoten und den Visuals 1 und 2 besteht.
  3. Erstellen Sie logische Oberflächen 1 und 2.
  4. Rufen Sie SetContent auf, um den Visuals 1 und 2 eine logische Oberfläche zuzuordnen.
  5. Rufen Sie BeginDraw auf einem Unterrechteck der logischen Oberfläche 1 auf.
  6. Aktualisieren Sie die Oberfläche am Offset, der von DirectComposition zurückgegeben wird.
  7. Optionale Schritte:
    1. Rufen Sie SuspendDraw auf der logischen Oberfläche 1 auf.
    2. Rufen Sie BeginDraw auf dem Subrekt der logischen Oberfläche 2 auf.
    3. Aktualisieren Sie die Oberfläche am Offset, der von DirectComposition zurückgegeben wird.
    4. Rufen Sie EndDraw auf logischer Oberfläche 2 auf.
    5. Rufen Sie ResumeDraw auf logischer Oberfläche 1 auf.
  8. Aktualisieren Sie die Oberfläche am Offset, der von DirectComposition zurückgegeben wird.
  9. Rufen Sie EndDraw auf logischer Oberfläche 1 auf.
  10. Rufen Sie Commit auf.

Virtuelle DirectComposition-Oberfläche

DirectComposition macht die IDCompositionVirtualSurface-Schnittstelle verfügbar, um eine virtuelle Oberfläche darzustellen, bei der es sich um eine Sammlung logischer Oberflächen (Kacheln) handelt, die in einem festen Raster mit Kacheln einer festen Größe angeordnet sind. Die Anwendung gibt die Größe der virtuellen Textur zum Zeitpunkt der Erstellung an. Die Größe legt die Grenzen für die virtuelle Oberfläche fest. Die Oberfläche kann einem oder mehreren Visuals zugeordnet werden.

Wenn eine virtuelle Oberfläche initialisiert wird, wird sie nicht durch tatsächliche Zuordnungen unterstützt. Mit anderen Worten, es enthält keine Bits. DirectComposition ordnet Kacheln (d. h. Kompositionsoberflächenobjekte) zu, nachdem die Anwendung mit dem Aktualisieren der Oberfläche begonnen hat. Die Anwendung aktualisiert die virtuelle Oberfläche, indem Sie BeginDraw aufruft und den relevanten Bereich in Bezug auf die Koordinaten der virtuellen Oberfläche angibt. Anschließend ordnet DirectComposition die erforderlichen Kacheln zu, um das Update zu halten, und gibt die zu aktualisierende Kompositionsoberfläche und den Offset zurück.

Wie bei logischen Oberflächen können Sie BeginDraw, SuspendDraw, ResumeDraw und EndDraw auf einer virtuellen Oberfläche aufrufen. Darüber hinaus macht DirectComposition Methoden verfügbar, mit denen Sie die Größe einer vorhandenen virtuellen Oberfläche ändern und kürzen können.

Ändern der Größe einer virtuellen Oberfläche

Die Resize-Methode ändert die Grenzen der virtuellen Oberfläche, was bedeutet, dass alle neuen Updates oder Zuordnungen in die durch die neue Größe festgelegten Grenzen fallen müssen. Eine Anwendung verwendet Resize , um DirectComposition mitzuteilen, dass ein bestimmter Bereich der virtuellen Oberfläche nicht mehr benötigt wird und wieder beansprucht werden kann. Wenn größe ändern die virtuelle Oberfläche verkleinern wird, kann die Anwendung die Regionen außerhalb der neuen Grenzen nicht mehr aktualisieren.

Die folgende Abbildung zeigt eine virtuelle Oberfläche von 3 x 3, die in 2-x-2-Größe geändert wurde. Der rote Bereich stellt Kacheln dar, die im Rahmen des Größenänderungsvorgangs verworfen werden, und der Arbeitsspeicher wird von DirectComposition wieder beansprucht. Nach dem Ändern der Größe kann die Anwendung keine Aktualisierungen am roten Bereich vornehmen, ohne die Größe der virtuellen Oberfläche erneut zu ändern.

Ändern der Größe einer virtuellen Oberfläche

Der Größenänderungsvorgang wird sofort wirksam. DirectComposition wartet nicht, bis die Anwendung Commit aufruft, um die Größenänderungsupdates vorzunehmen. Angenommen, eine Anwendung führt die folgende Sequenz von Aufrufen aus.

pVirtualSurface->Resize(0, 0);
pVirtualSurface->Resize(INT_MAX, INT_MAX);
pDevice->Commit();

In diesem Beispiel verliert die Anwendung bei der ersten Größenänderung den gesamten Inhalt. Die zweite Größenänderung hat keine Auswirkung, obwohl sie vor Commit aufgerufen wurde. In diesem Fall wird nichts auf dem Bildschirm angezeigt.

Kürzen einer virtuellen Oberfläche

Die Trim-Methode identifiziert den Bereich der virtuellen Oberfläche, die die Anwendung benötigt. Die Größe der virtuellen Oberfläche wird nicht geändert, aber DirectComposition wird mitgeteilt, welche logischen Oberflächen derzeit zugeordnet werden müssen.

In der folgenden Abbildung ist das grüne Quadrat der Viewport der Anwendung. Die Anwendung rendert zunächst die ersten sechs Kacheln (blau) der virtuellen Oberfläche (hellgrau), die sich im Viewport befinden. Da die Seite, die durch die virtuelle Oberfläche dargestellt wird, scrollt, muss die Anwendung die letzten sechs Kacheln rendern. Die Anwendung ruft Trim auf, um anzugeben, dass der durch die letzten sechs Kacheln definierte Bereich der Inhalt ist und der Rest derzeit nicht benötigt wird. DirectComposition kann dann die logischen Oberflächen wiederverwenden, die ursprünglich die ersten sechs Kacheln (dunkelgrau) darstellten.

Kürzen einer virtuellen Oberfläche

DirectComposition-Konzepte