Sdílet prostřednictvím


Základní koncepty

Poznámka

U aplikací ve Windows 10 doporučujeme místo DirectComposition používat rozhraní API pro Windows.UI.Composition. Další informace najdete v tématu Modernizace desktopové aplikace pomocívrstvy vizuálu .

Toto téma obsahuje přehled základních konceptů aplikace Microsoft DirectComposition. Obsahuje následující části:

Složení

DirectComposition definuje kompozici jako kolekci bitmapových obrázků, které jsou kombinovány a upravovány pomocí různých transformací, efektů a animací, aby vytvořily vizuální výsledek v uživatelském rozhraní aplikace. DirectComposition funguje pouze s rastrovým obsahem; nepodporuje vektory ani text. DirectComposition neposkytuje rastrový obsah. Místo toho poskytuje rozhraní, ve kterých můžou uživatelé kreslit pomocí D2D, DXGI nebo nahrát vlastní obsah textury.

Aplikace DirectComposition vytvoří dvě sady objektů pro vytvoření scény: rastrové obrázky, které se skládají dohromady, a vizuály definující prostorové vztahy mezi rastrovými obrázky. Další informace o rastrových objektech podporovaných aplikací DirectComposition naleznete v tématu Bitmap objekty.

Vizualizace

Vizuální prvky (nebo vizuální objekty) jsou základními prvky DirectComposition. Jedná se o základní stavební bloky, které používáte k vytváření kompozic a animací v uživatelském rozhraní aplikace.

V programovacích termínech je vizuál objektem, který má sadu vlastností, a zveřejňuje rozhraní, které používáte k nastavení hodnoty vlastností. Vlastnost Content vizuálu přidruží konkrétní rastrový obrázek k vizuálu, zatímco ostatní vlastnosti řídí, jak DirectComposition pozicuje a manipuluje s vizuálem při jeho vykreslení na obrazovku.

Další informace naleznete v tématu Vlastnosti vizuálu.

Vizuální strom

DirectComposition vytvoří kompozici z hierarchické kolekce vizuálních objektů, nazývané vizuální strom. Vizuál v kořeni stromu se nazývá kořenový vizuál a může mít jeden nebo více podřízených vizuálů, které s ním souvisí. Podřízený vizuál může mít jeden nebo více vlastních podřízených vizuálů. Libovolný vizuál, který má přidružené podřízené vizuály, se nazývá nadřazený vizuál, a všechny podřízené vizuály, které sdílejí stejný nadřazený vizuál, se nazývají sourozenecké vizuály. Konkrétní vizuál spolu se všemi podřízenými a sestupnými vizuály se nazývá podstrom vizuálu.

Umístění vizuálu ve stromu pomáhá určit jeho umístění na obrazovce a pořadí vykreslování vzhledem k ostatním vizuálům ve struktuře. Kořenový vizuál je umístěn relativně vůči levému hornímu rohu klientské oblasti cílového okna, kde se vykresluje kompozice. Všechny podřízené vizuály se umístí vzhledem k levému hornímu rohu svého nadřazeného vizuálu (nebo vizuálu určeného vlastností TransformParent) a vždy se zobrazí před nadřazeným vizuálem v pořadí vrstev.

Následující ilustrace ukazuje kompozici vizuálů a strukturu vizuálního stromu, který se používá k vytvoření této kompozice. Vizuál 1 je kořenový vizuál a je také nadřazený podřízeným vizuálům 2 a 3, což jsou vizuály na stejné úrovni. Vizuál 3 má dva vlastní podřízené vizuály, vizuály 4 a 5. Vizuály 3 až 5 společně tvoří podstrom vizuálu.

kompozice vizuálů a odpovídající vizuální strom

Nadřazený vizuál udržuje seřazený seznam podřízených vizuálů. Když jsou vizuály na stejné úrovni umístěny tak, aby se vzájemně překrývaly, DirectComposition nastaví hloubkové pořadí (z-order) sourozenců na základě pořadí, ve kterém se objevují v seznamu podřízených položek nadřazeného vizuálu. Sourozenec, který se zobrazí později v seznamu, je umístěn před všechny sourozence, které se zobrazí dříve v seznamu. Následující obrázek znázorňuje pořadí vykreslování překrývajících se podřízených vizuálů.

pořadí vykreslování překrývajících se podřízených vizuálů

Vlastnosti objektu vizuálu

Objekt vizuálu vystavuje sadu vlastností, které umožňují nastavit rastrový obsah vizuálu a řídit, jak DirectComposition umísťuje a manipuluje obsahem vizuálu. Následující části popisují jednotlivé vlastnosti podrobně.

Vlastnost obsahu

Vlastnost Content vizuálu určuje rastrový obsah přidružený k vizuálu. Toto je rastrový obrázek, který DirectComposition používá při zahrnutí vizuálu do složení.

Vlastnost Content vizuálu nastavíte voláním IDCompositionVisual::SetContent metoda.

Další informace o typech rastrového obsahu podporovaných DirectComposition naleznete v tématu Bitmap objekty.

Vlastnost Clip

Vlastnost Klip vizuálu určuje obdélníkovou oblast označovanou jako oblast výřezu (nebo klipový obdélník). Při vykreslení vizuálu se zobrazí jenom část vizuálu, která spadá do oblasti výřezu, zatímco veškerý obsah, který se rozšiřuje mimo oblast výřezu, se ořízne (to znamená, že se nezobrazuje). DirectComposition podporuje oblasti výřezu, které mají zaoblené nebo čtvercové rohy.

Vlastnost Clip vizuálu nastavíte voláním metody IDCompositionVisual::SetClip.

Další informace najdete v tématu Výřez.

Vlastnost BorderMode

Vlastnost BorderMode určuje, jak složit okraje rastrových obrázků a klipů přidružených k tomuto vizuálu nebo k vizuálům ve stromu, jehož kořenem je tento vizuál.

Režim ohraničení má vliv na to, jak se hrany rastrového obrázku skládají při transformaci rastrového obrázku tak, aby hrany nebyly zarovnané s celočíselnou souřadnicí. Ovlivňuje také, jak je obsah oříznutý v rozích klipu, který má zaoblené rohy, a na okraji klipu, který je transformován tak, aby hrany nebyly zarovnané s celočíselnými souřadnicemi.

Další informace naleznete v IDCompositionVisual::SetBorderMode.

BitmapInterpolationMode – vlastnost

Vlastnost BitmapInterpolationMode určuje DirectComposition, jak skládat bitmapu při transformaci, kdy neexistuje žádná 1:1 korespondence mezi pixely v bitmapě a pixely na obrazovce.

BitmapInterpolationMode vlastnost vizuálu voláním IDCompositionVisual::SetBitmapInterpolationMode metoda.

Vlastnost CompositeMode

Vlastnost CompositeMode určuje DirectComposition, jak kombinovat rastrový obsah vizuálu s cílovým povrchem rendrování. Popis podporovaných složených režimů najdete v tématu DCOMPOSITION_COMPOSITE_MODE.

Vlastnost CompositeMode vizuálu nastavíte voláním IDCompositionVisual::SetCompositeMode metoda.

Vlastnosti OffsetX a OffsetY

Vlastnosti OffsetX a OffsetY udávají DirectComposition, kde umístit vizuál vodorovně a svisle. Definují dvourozměrnou pevnou pozici, ze které se vypočítají všechny transformace a efekty vizuálu.

U kořenového vizuálu vlastnosti OffsetX a OffsetY definují souřadnici x a souřadnici y bodu vzhledem k levému hornímu rohu okna, které je hostitelem vizuálu. U dceřiného vizuálu jsou souřadnice relativní k levému hornímu rohu nadřazeného objektu nebo, pokud je specifikována vlastnost TransformParent, levému hornímu rohu zadaného vizuálu. Při vykreslení vizuálu se umístí tak, aby se levý horní roh vizuálu shodoval se zadanými souřadnicemi.

Vlastnosti OffsetX a OffsetY vizuálu nastavíte voláním metod IDCompositionVisual::SetOffsetX a SetOffsetY metody.

Efektová vlastnost

Vlastnost Effect umožňuje určit efekt nebo skupinu efektů, které upraví způsob, jak se vizuál a jeho podstrom skládá. Můžete například určit efekty, které řídí neprůhlednost vizuálu, prolnutí vizuálu s jiným rastrovým obrázkem různými způsoby a použití transformací perspektivy ve vizuálu.

Vlastnost Effect vizuálu nastavíte voláním IDCompositionVisual::SetEffect metoda.

Další informace naleznete v tématu Efekty.

Přetransformovat vlastnost

Vlastnost Transform určuje dvourozměrnou (2D) transformaci nebo skupinu 2D transformací, kterou DirectComposition provede na vizuálu. Transformace (nebo transform) je operace, která upravuje souřadnicový systém vizuálu vzhledem k jeho rodiči nebo vzhledem k vizuálu specifikovanému vlastností TransformParent. Pomocí transformací můžete změnit pozici, velikost nebo povahu vizuálu tak, že ho přesunete do jiného umístění (překlad), zvětšíte nebo zmenšíte (měřítko), otočíte ho (otočení), zkreslíte jeho tvar (skewing) atd.

Vlastnost Transform vizuálu nastavíte voláním IDCompositionVisual::SetTransform metoda.

Další informace naleznete v tématu Transformace.

TransformParent – vlastnost

Souřadnicový systém vizuálu je upraven vlastnostmi OffsetX, OffsetY a Transform. Za normálních okolností tyto vlastnosti definují souřadnicový systém vizuálního objektu vzhledem k jeho bezprostřednímu rodiči. Chcete-li použít jiný vizuál než nadřazený jako základ pro souřadnicový systém podřízeného vizuálu, použijte vlastnost TransformParent k určení jiného vizuálu jako "nadřazeného" pro účely transformace.

Vlastnost TransformParent vizuálu nastavíte voláním IDCompositionVisual::SetTransformParent metoda.

Objekt zařízení

Chcete-li použít DirectComposition, musíte vytvořit a manipulovat s různými objekty modelu COM (Component Object Model). Prvním objektem, který potřebujete vytvořit, je objekt zařízení DirectComposition , protože slouží jako továrna pro vytváření všech ostatních objektů použitých při kompozici.

Objekt zařízení vytvoříte voláním funkce DCompositionCreateDevice, která vrátí ukazatel rozhraní IDCompositionDevice. Toto rozhraní zveřejňuje sadu metod, které slouží k vytváření vizuálních objektů, objektů klipů, animačních objektů, transformací objektů, objektů efektu atd.

Kromě toho, že slouží k vytváření dalších objektů, má objekt zařízení ještě jiný účel. Zveřejňuje metodu s názvem Commit, která předává vizuální strom do DirectComposition ke zpracování. Další informace naleznete v tématu Transakční Složení.

Mějte na paměti, že zatímco ve své aplikaci můžete vytvořit více instancí objektu zařízení, musí být všechny objekty, které používáte v určitém složení, vytvořeny stejným objektem zařízení – s jednou výjimkou: Ve stejném vizuálním stromu můžete kombinovat vizuální objekty z různých objektů zařízení. Když to uděláte, DirectComposition zachází se stromem obrazu jako obvykle, s tím rozdílem, že změny na konkrétním vizuálním objektu v tomto stromu se projeví pouze, když je metoda Commit zavolána na objektu zařízení, který vytvořil tento vizuální objekt.

Možnost používat vizuály z různých zařízení ve stejném stromu vizuálů umožňuje více vláken vytvářet a manipulovat s jedním vizuálním stromem a současně udržovat dvě nezávislá zařízení, která lze použít k asynchronnímu potvrzení změn. Další informace najdete v tématu Vizuální stromy pro více zařízení.

Cílové okno kompozice

Aby se na obrazovce mohl zobrazit některý z vizuálů stromu, musí být vizuální strom připojen k oknu. Okno, nazývané kompoziční cílové okno, může být okno nejvyšší úrovně nebo podřízené okno. Cílovým oknem složení může být také vrstvené okno; to znamená, že může mít styl okna WS_EX_LAYERED.

DirectComposition umožňuje aplikaci k každému oknu připojit maximálně dva vizuální stromy. Vizuální stromy zahrnují jeden, který je složen na samotném okně, ale za všemi jeho podřízenými okny, a další, který je složen nad oknem i nad podřízenými okny. Jinými slovy, každé okno má čtyři konceptuální vrstvy a všechny vrstvy jsou oříznuty na viditelnou oblast cílového okna. Následující obrázek znázorňuje čtyři koncepční vrstvy okna.

koncepční vrstvy okna

Transakční složení

DirectComposition používá transakční model, ve kterém vytvoříte dávkovanou sadu změn vizuálu a poté ji „potvrdíte“ DirectComposition ke zpracování všech najednou. Můžete upravit stejný objekt vizuálu DirectComposition a potvrdit změny libovolný počet. Když Správce oken plochy (DWM) převezme dávky, převezme všechny nevyřízené dávky a použije je na další rámec v pořadí, v jakém byly potvrzeny.

U všech změn v rámci jednoho commitu je zaručeno použití na jeden rámec. Vzhledem k tomu, že DWM shromažďuje dávky jednou za snímek, můžete upravit konkrétní objekt pouze jednou po dobu jednoho snímku. Následné commity, které upravují různé objekty, mohou být aplikovány také na aktuální snímek, ale DirectComposition nezaručuje, že změny se uskuteční ve stejném snímku.

Metody IDCompositionSurface::BeginDraw a IDCompositionSurface::EndDraw umožňují synchronizovat aktualizace vykreslování s aktualizacemi vizuálů. Můžete například volat IDCompositionSurface::BeginDraw, aktualizovat vlastnosti OffsetX a Clip vizuálu, volat IDCompositionDevice::Commit, kreslit obsah pomocí Rozhraní Microsoft DirectX a potom volat IDCompositionSurface::EndDraw. V tomto případě Microsoft DirectComposition zajišťuje, aby rastrový obsah a vlastnosti vizuálu byly aktualizovány současně.

Dávkování

V rámci stejného rámce můžete zaznamenat více změn do stejného vizuálu nebo do různých vizuálů. Při provádění více změn stejného vizuálu ve stejném rámci mějte na paměti následující body:

  • Pokud ve stejné vlastnosti vizuálu provedete více změn, použije se pouze poslední změna. Pokud například nastavíte neprůhlednost na hodnotu 0, pak na hodnotu 0,5 a nakonec na hodnotu 1.0, pro vizuál se použije pouze neprůhlednost 1,0.

  • Pokud změníte více vlastností stejného vizuálu, DirectComposition nejprve použije změny na samotný vizuál a potom na všechny podřízené vizuály. Vlastnosti se použijí v následujícím pořadí bez ohledu na pořadí, ve kterém je zadáte:

    1. Ofset
    2. Přeměnit
    3. Klips
    4. Účinek

    Následující obrázek znázorňuje výsledek použití všech čtyř vlastností u vizuálu.

    výsledek použití všech čtyř vlastností na vizuální

    Nezapomeňte, že všechny změny se u vizualizace aplikují současně v kontextu stejného rámce. To znamená, že změny vizuálu se z pohledu uživatele projeví okamžitě.

  • Pro Transform vlastnost můžete použít IDCompositionDevice::CreateTransformGroup vytvořit skupinu transformací, které se použijí na vizuál najednou. DirectComposition použije transformace v pořadí, ve kterém zadáte.

  • Pro vlastnost Effect můžete použít IDCompositionEffectGroup pro aplikaci skupiny efektů. DirectComposition použije efekty v zadaném pořadí. Kromě toho vedou transformace 3D perspektivy k zploštění vizuálního stromu poté, co byly v aktuálním vizuálu aplikovány všechny 3D transformace. To pomáhá zajistit, aby výsledný vizuál vypadal co nejblíže 3D.

Synchronizace

Aplikace může současně volat DirectComposition z více vláken. Pořadí provádění je zaručeno pro sekvenční volání, ale ne pro souběžná volání. Pokud například vlákno A upraví vizuál a vlákno B potvrdí dávku ve stejnou dobu, není definováno, zda je tato změna vizuálu zahrnuta do potvrzené dávky nebo zda spustí novou dávku. Pokud vaše aplikace používá jiné mechanismy synchronizace, aby se zajistilo, že jedna metoda je volána před druhou metodou, DirectComposition respektuje pořadí volání a zpracovává je, jako by obě volání byla vydána v daném pořadí z jednoho vlákna.

Vizuální stromy napříč různými zařízeními

Objekty DirectComposition nejsou vázány vláknem; K úpravě stejné sady objektů můžete použít více vláken. Mějte však na paměti následující problémy při sdílení stejného objektu zařízení.

  • Obě vlákna musí být schopna volat IDCompositionDevice::Commit. Pokud pouze jedno z vláken volá IDCompositionDevice::Commit, druhé vlákno nemůže potvrdit žádné své změny v DirectComposition.
  • Transakční chování může být ztraceno, pokud jedno vlákno volá IDCompositionDevice::Commit zatímco druhé vlákno stále provádí změny, které mají být součástí stejné transakce.

Pokud potřebujete do DirectComposition potvrdit více souběžných transakcí, musíte použít více objektů zařízení, pravděpodobně z více vláken. V tomto scénáři sdílí tentýž vizuální strom oba objekty zařízení a každý z nich potvrdí své vlastní transakce.

Následující obrázek znázorňuje vizuální strom, který sdílí dva objekty zařízení. Vizuály 1, 2, 4 a 5 jsou vlastněny jedním zařízením nebo druhým, ale vizuál 3 je sdílen oběma zařízeními, a proto se dá použít k propojení dvou dílčích stromů do jednoho většího vizuálního stromu. Sdílení vizuálního stromu umožňuje, aby dvě zařízení byla manipulována ze dvou různých vláken asynchronně.

strom vizuálu sdílený dvěma zařízeními

Pokud chcete ilustrovat užitečnost sdílení vizuálního stromu mezi dvěma zařízeními, zvažte architekturu, která umožňuje dotykové zadávání s nízkou latencí. Architektura může používat dvě vlákna, jedno, které zpracovává většinu úloh uživatelského rozhraní, a druhé vlákno vyhrazené pro zpracování událostí dotykového vstupu. Dotykové vlákno aktualizuje transformaci konkrétního vizuálu na základě gesta vstupu uživatele. Díky aktualizaci transformace může dotykové vlákno způsobit, že celý podstrom pod tímto vizuálem sleduje prst uživatele, zvětšuje nebo zmenšuje se, když uživatel provede vícedotykové gesto, a podobně. Vlákno uživatelského rozhraní si uchovává vlastnictví většiny kompozičního stromu, zatímco dotykové vlákno má na starost pouze několik vizuálů, které jsou označeny pro asynchronní odezvu na dotyk. Následující obrázek znázorňuje zjednodušenou verzi takového kompozičního stromu:

vizuální strom sdílený mezi vláknem uživatelského rozhraní a vláknem dotyku

Vlákno uživatelského rozhraní obvykle upravuje pouze vizuály, které vlastní výhradně, a dotykové vlákno upravuje pouze sdílený vizuál. Jedinou výjimkou je vytvoření nebo zničení podstromu s podporou dotykového ovládání.

IDCompositionSurface::BeginDraw

IDCompositionSurface::EndDraw

IDCompositonDevice::Commit

koncepty DirectComposition