Překlopení DXGI modelu
Windows 8 přidává podporu pro překlopení prezentační model a jeho přidružené současné statistiky v DXGI 1.2. Převrácený prezentační model DXGI ve Windows 8 je podobný modelu Direct3D 9EX Flip Mode Presentation. Aplikace pro prezentace založené na video nebo snímkové frekvenci, jako jsou hry, můžou být přínosnější díky překlopení prezentačního modelu. Aplikace, které používají prezentační model DXGI, snižují zatížení systémových prostředků a zvyšují výkon. Aplikace můžou také využít vylepšení prezentačních statistik s překlopeným prezentačním modelem k lepšímu řízení míry prezentace tím, že poskytují mechanismy zpětné vazby a opravy v reálném čase.
- Porovnání překlopení DXGI a modelu BitBlt
- Jak používat překlopení DXGI
- Synchronizace snímků aplikací překlopení DXGI
- vyhnout se, zjišťovat a obnovovat z
- související témata
Porovnání překlopení DXGI a modelu BitBlt
Modul runtime používá přenos bit-block (bitblt) a překlopení prezentačních modelů k prezentaci grafického obsahu na monitorech zobrazení. Největší rozdíl mezi bitblt a flip prezentační modely je způsob, jak se obsah back-buffer dostat do Windows 8 DWM pro složení. V modelu bitblt se obsah zpětné vyrovnávací paměti zkopíruje do povrchu přesměrování na každém volání IDXGISwapChain1::P resent1. V modelu překlopení jsou všechny vyrovnávací paměti sdílené se Správcem oken plochy (DWM). Proto může DWM vytvářet přímo z těchto zpětných vyrovnávacích pamětí bez jakýchkoli dalších operací kopírování. Obecně platí, že překlopení modelu je efektivnější. Převrácený model také poskytuje více funkcí, jako jsou rozšířené současné statistiky.
Pokud máte starší verze komponent, které používají rozhraní GDI (Windows Graphics Device Interface) k zápisu do HWND přímo, použijte bitblt model.
Vylepšení výkonu modelu DXGI flip jsou důležitá, když je aplikace v režimu okna. Sekvence v této tabulce a na obrázku porovnávají využití šířky pásma paměti a čtení a zápisy aplikací s okny, které zvolí překlopení modelu a model bitblt.
Krok | Model BitBlt, který je přítomný do DWM | Překlopení modelu DXGI do DWM |
---|---|---|
1. | Aplikace aktualizuje svůj rámec (zapisovat) |
Aplikace aktualizuje svůj rámec (zapisovat) |
2. | Modul runtime Direct3D kopíruje obsah povrchu na plochu přesměrování DWM (čtení, zápis) |
Modul runtime Direct3D předá aplikaci do DWM. |
3. | Po dokončení kopírování sdíleného povrchu vykreslí DWM plochu aplikace na obrazovku (čtení, zápis) |
DWM vykreslí plochu aplikace na obrazovku (čtení, zápis) |
Překlopení modelu snižuje využití systémové paměti snížením počtu čtení a zápisů modulem runtime Direct3D pro složení okenního rámce podle DWM.
Použití překlopení modelu DXGI
Aplikace Direct3D 11.1, které cílí na Windows 8, používají model flip tím, že vytvoří řetězec prohození s hodnotou výčtu DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL nastavenou v SwapEffect člen struktury DXGI_SWAP_CHAIN_DESC1. Když nastavíte SwapEffect na DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL, nastavte tyto členy DXGI_SWAP_CHAIN_DESC1 na uvedené hodnoty:
- BufferCount na hodnotu mezi 2 a 16, aby se zabránilo snížení výkonu v důsledku čekání na uvolnění předchozí prezentační vyrovnávací paměti DWM.
- formátovat na DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_B8G8R8A8_UNORM nebo DXGI_FORMAT_R8G8B8A8_UNORM
- Počet člen struktury DXGI_SAMPLE_DESC, kterou člen SampleDesc určuje, a Quality člen DXGI_SAMPLE_DESC na nulu, protože není podporováno více antialiasingu (MSAA) vzorku
Pokud používáte DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL v operačním systému Windows 7 nebo starším, vytvoření zařízení se nezdaří. Při použití modelu překlopení můžete použít statistiku zobrazení na celé obrazovce v režimu okna. Chování na celé obrazovce není ovlivněno. Pokud předáte NULLpFullscreenDesc parametr IDXGIFactory2::CreateSwapChainForHwnd pro řetězec prohození oken a nastavíte SwapEffect na DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL, modul runtime vytvoří jednu dodatečnou vyrovnávací paměť a otočí, podle toho, který úchyt patří do vyrovnávací paměti, která se stane frontovou vyrovnávací pamětí v době prezentace.
Při použití překlopení modelu zvažte tyto tipy:
- Použít jeden překlopení modelu řetěz na HWND. Necílejte na více překlopení modelů řetězy na stejný HWND.
- Nepoužívejte řetězec překlopení modelů s funkcí ScrollWindow nebo ScrollWindowEx funkce. Některé aplikace Direct3D používají funkce GDI ScrollWindow a ScrollWindowEx k aktualizaci obsahu okna po události posouvání uživatele. ScrollWindow a ScrollWindowEx provádět bitblty obsahu okna na obrazovce při posouvání okna uživatelem. Tyto funkce také vyžadují aktualizace modelu bitblt pro obsah GDI a Direct3D. Aplikace, které používají některou funkci, nemusí nutně zobrazovat posouvání viditelného obsahu okna na obrazovce, když je aplikace v režimu okna. Doporučujeme nepoužívat funkce GDI ScrollWindow a ScrollWindowEx a místo toho překreslit obsah GDI a Direct3D na obrazovce v reakci na posouvání.
- Použití překlopení modelu v HWND, které nejsou také cílem jiných rozhraní API, včetně prezentační model DXGI bitblt, jiných verzí Direct3D nebo GDI. Vzhledem k tomu, že model bitblt udržuje další kopii povrchu, můžete přidat GDI a další obsah Direct3D do stejného HWND prostřednictvím kusmeálních aktualizací z Direct3D a GDI. Při použití překlopení modelu jsou viditelné pouze obsah Direct3D v překlopeném řetězci prohození modelů, které modul runtime předává do DWM. Modul runtime ignoruje všechny ostatní aktualizace obsahu bitblt modelu Direct3D nebo GDI.
Synchronizace snímků aplikací s překlopeným modelem DXGI
Prezentační statistiky jsou informace o časování snímků, které aplikace médií používají k synchronizaci video a zvukových streamů a obnovení z chyb přehrávání videa. Aplikace můžou pomocí informací o časování snímků v aktuálních statistikách upravit míru prezentace snímků videa pro plynulejší prezentaci. Chcete-li získat informace o aktuální statistiky, zavolejte IDXGISwapChain::GetFrameStatistics metoda získání DXGI_FRAME_STATISTICS struktury. DXGI_FRAME_STATISTICS obsahuje statistiky o voláních IDXGISwapChain1::P resent 1. Řetěz prohození převrácených modelů poskytuje informace o statistikách v režimu okna i režimu zobrazení na celé obrazovce. U řetězů prohození modelu bitblt v režimu oken jsou všechny hodnoty DXGI_FRAME_STATISTICS nuly.
V případě překlopení modelu IDXGISwapChain::GetFrameStatistics v těchto situacích vrátí DXGI_ERROR_FRAME_STATISTICS_DISJOINT:
- První volání GetFrameStatistics, který označuje začátek sekvence
- Změna režimu: přechody na celou obrazovku nebo z režimu celé obrazovky nebo z celé obrazovky na přechody na celou obrazovku
Hodnoty v PresentRefreshCount, SyncRefreshCounta SyncQPCTime členy DXGI_FRAME_STATISTICS mají následující charakteristiky:
- PresentRefreshCount se rovná SyncRefreshCount, když aplikace prezentuje v každé vsync.
- SyncRefreshCount se získá v intervalu vsync při odeslání, SyncQPCTime je přibližně doba přidružená k intervalu vsync.
Metoda IDXGISwapChain::GetLastPresentCount vrátí poslední aktuální počet, tj. id posledního úspěšného IDXGISwapChain1::P resent1 volání zobrazeného zařízení přidruženého k řetězci prohození. Toto ID je hodnota PresentCount člen struktury DXGI_FRAME_STATISTICS. U řetězů prohození modelu bitblt v režimu oken jsou všechny hodnoty DXGI_FRAME_STATISTICS nuly.
Vyhněte se, detekujte a obnovujte se z chyb
Pomocí těchto kroků se v prezentaci rámečku vyhněte, detekujte je a obnovte z nich:
Volání fronty IDXGISwapChain1::P resent1 volání (to znamená volání IDXGISwapChain1::P resent1 několikrát, což způsobí, že se shromažďují ve frontě).
Vytvořte strukturu prezentující fronty pro úspěšné uložení všech úspěšně odeslaných IDXGISwapChain1::P resent1id přítomnosti (vráceno IDXGISwapChain::GetLastPresentCount) a přidružené, počítané/očekávané PresentRefreshCount hodnoty.
Detekce závady:
- Volání IDXGISwapChain::GetFrameStatistics.
- Pro tento rámec získejte aktuální ID (PresentCount) a počet vsync, kde operační systém zobrazil poslední image monitoru (PresentRefreshCount).
- Načtěte očekávanou PresentRefreshCount, která je přidružená k současnému ID a která jste dříve uložili ve struktuře prezentující fronty.
- Pokud je skutečný PresentRefreshCount pozdější než očekávaný PresentRefreshCount, došlo k chybě.
Obnovení z chyby:
Spočítejte počet snímků, které se mají přeskočit k obnovení ze chyby. Pokud například krok 3 odhalí, že očekávaný počet vsync (PresentRefreshCount) pro aktuální ID (PresentCount) je 5 a skutečný počet vsync pro aktuální ID je 8, počet snímků, které se mají přeskočit k obnovení ze slitchu, je 3 snímky.
Předejte hodnotu 0 parametru SyncInterval v tomto počtu volání IDXGISwapChain1::P resent1 zahodit a přeskočit tento počet snímků.
Poznámka
Pokud se chyba skládá z velkého počtu snímků, zavolejte IDXGISwapChain1::P resent1 s parametrem Flags nastaveným na DXGI_PRESENT_RESTART zahodit a přeskočit všechny nevyřízené položky ve frontě.
Tady je ukázkový scénář zotavení z chyb v prezentaci s rámečkem:
V ukázkovém scénáři očekáváte, že snímek A přejde na obrazovku na počtu vsync 1. Ve skutečnosti ale zjistíte počet vsync, který se snímek A zobrazí na obrazovce jako 4. Proto zjistíte, že došlo k výpadku. Pak můžete zahodit 3 rámce, to znamená, že do parametru SyncInterval můžete předat 0 ve 3 voláních IDXGISwapChain1::P resent1. V předchozím ukázkovém scénáři potřebujete k obnovení z chyby celkem 8 IDXGISwapChain1::P resent1 volání. 9. rámec se pak zobrazí podle očekávaného počtu vsync.
Tady je časový řádek prezentačních událostí. Každá svislá čára představuje vsync. Vodorovný směr je čas, který se zvyšuje doprava. Pomocí obrázku si můžete představit, jak může dojít k výpadkům.
Obrázek znázorňuje tuto posloupnost:
Aplikace se probudí na vsync, vykreslí modrou barvu, zavolá IDXGISwapChain1::P resent1a pak se vrátí do režimu spánku.
Grafický procesor (GPU) se probudí z nečinnosti, provede vykreslení modře a pak se vrátí do režimu spánku.
DWM se probudí na další vsync, sesloží modře do jeho zadní vyrovnávací paměti, zavolá IDXGISwapChain1::P resent1a pak se vrátí do režimu spánku.
Aplikace se probudí, vykreslí zeleně, zavolá IDXGISwapChain1::P resent1a pak se vrátí do režimu spánku.
Poznámka
Aplikace se provádí souběžně, když GPU provádí vytvoření modrého.
V dalším kroku se GPU vykreslí zeleně pro aplikaci.
Nakonec digitální na analogový převaděč (DAC) ukazuje výsledky složení DWM na monitoru na další vsync.
Z časového řádku si můžete představit latenci současné statistiky a způsob výskytu závad. Pokud chcete například zobrazit zelenou barvu dwm pro zelenou barvu zobrazenou na obrazovce, představte si rozšíření zeleného/červeného rámečku tak, aby pravá strana zeleného/červeného rámečku odpovídala pravé straně fialového/červeného rámečku. V tomto scénáři daC zobrazuje dva rámečky modré a pak zelené rámečky. Vidíte, že k této chybě došlo při čtení aktuální statistiky.
Související témata