Důležité změny z Direct3D 11 na Direct3D 12
Direct3D 12 představuje významný odchod od programovacího modelu Direct3D 11. Direct3D 12 umožňuje aplikacím blíž k hardwaru než kdy dřív. Díky přiblížení hardwaru je Direct3D 12 rychlejší a efektivnější. Ale kompromisem vaší aplikace s vyšší rychlostí a efektivitou s Direct3D 12 je, že zodpovídáte za více úkolů, než jste byli s Direct3D 11.
- explicitní synchronizace
- správy rezidencí fyzické paměti
- objekty stavu kanálu
- seznamy příkazů a sady
- haldy popisovače a tabulky
- portování z Direct3D 11
- související témata
Direct3D 12 je návrat k programování na nízké úrovni; Poskytuje větší kontrolu nad grafickými prvky her a aplikací tím, že představuje tyto nové funkce: objekty reprezentující celkový stav kanálu, seznamy příkazů a sady pro odeslání práce a popisovače a tabulky pro přístup k prostředkům.
Vaše aplikace má vyšší rychlost a efektivitu s Direct3D 12, ale zodpovídáte za více úkolů, než jste byli u Direct3D 11.
Explicitní synchronizace
- V Direct3D 12 je teď CPU-GPU synchronizace explicitní odpovědností aplikace a modul runtime ji už implicitně neprovádí, protože je v Direct3D 11. Tato skutečnost také znamená, že bez automatické kontroly rizik kanálu se provádí Direct3D 12, takže to je opět zodpovědností aplikací.
- V Direct3D 12 zodpovídají aplikace za kanálování aktualizací dat. To znamená, že vzor Map/Lock-DISCARD v Direct3D 11 musí být proveden ručně v Direct3D 12. Pokud gpu v Direct3D 11 stále používá vyrovnávací paměť při volání ID3D11DeviceContext::Map s D3D11_MAP_WRITE_DISCARD, modul runtime vrátí ukazatel na novou oblast paměti místo starých dat vyrovnávací paměti. Gpu tak může dál používat stará data, zatímco aplikace umístí data do nové vyrovnávací paměti. V aplikaci není nutná žádná další správa paměti; původní vyrovnávací paměť se znovu použije nebo automaticky zničí, jakmile s ním GPU skončí.
- V Direct3D 12 jsou všechny dynamické aktualizace (včetně konstantních vyrovnávacích pamětí, dynamických vyrovnávacích pamětí vrcholů, dynamických textur atd.) explicitně řízeny aplikací. Mezi tyto dynamické aktualizace patří všechny požadované ploty GPU nebo ukládání do vyrovnávací paměti. Aplikace zodpovídá za zachování dostupné paměti, dokud ji už nepotřebujete.
- Direct3D 12 používá počítání odkazů ve stylu MODELU COM pouze po dobu životnosti rozhraní (pomocí slabého referenčního modelu Direct3D svázaného s životností zařízení). Všechny životnosti prostředků a popisů paměti jsou jediným zodpovědném způsobem, který aplikace udržuje po správnou dobu trvání a nejsou počítány. Direct3D 11 používá ke správě životnosti závislostí rozhraní také počítání odkazů.
Správa rezidencí fyzické paměti
Aplikace Direct3D 12 musí zabránit časování mezi několika frontami, více adaptéry a vlákny procesoru. D3D12 už nesynchronizuje procesor a GPU ani nepodporuje vhodné mechanismy pro přejmenování prostředků nebo více vyrovnávacích pamětí. Ploty musí být použity k tomu, aby se zabránilo více jednotek zpracování z nadměrného zápisu paměti před tím, než jiné jednotky zpracování dokončí jeho použití.
Aplikace Direct3D 12 musí zajistit, aby data byla v paměti, zatímco gpu je čte. Paměť používaná jednotlivými objekty je vytvořena rezidentem během vytváření objektu. Aplikace, které tyto metody volají, musí používat ploty, aby gpu nepřistupovaly k objektům, které byly vyřazeny.
Překážky prostředků jsou dalším typem potřebné synchronizace, která se používá k synchronizaci přechodů prostředků a podsourců na velmi podrobné úrovni.
Viz správa paměti v direct3D 12.
Objekty stavu kanálu
Direct3D 11 umožňuje manipulaci se stavem kanálu prostřednictvím velké sady nezávislých objektů. Například stav vstupního assembleru, stav shaderu pixelů, stav rasterizátoru a stav sloučení výstupu lze nezávisle upravit. Tento návrh poskytuje pohodlnou a relativně vysokou reprezentaci grafického kanálu, ale nevyužívá možnosti moderního hardwaru, především proto, že různé stavy jsou často vzájemně závislé. Mnoho GPU například kombinuje pixel shader a stav sloučení výstupu do jedné hardwarové reprezentace. Vzhledem k tomu, že rozhraní API Direct3D 11 umožňuje nastavit tyto fáze kanálu samostatně, ovladač zobrazení nemůže vyřešit problémy se stavem kanálu, dokud se stav nedokončí, což není do doby kreslení. Toto schéma zpožďuje nastavení stavu hardwaru, což znamená větší režii a méně maximálních volání kreslení na rámec.
Direct3D 12 toto schéma řeší sjednocením velké části stavu kanálu na neměnné objekty stavu kanálu (PSO), které jsou finalizovány při vytváření. Hardware a ovladače pak můžou okamžitě převést PSO na jakékoli instrukce a stav hardwaru, které jsou potřeba ke spuštění GPU. Stále můžete dynamicky měnit, který psO se používá, ale k tomu je potřeba, aby hardware zkopíroval pouze minimální množství předem vypočítaného stavu přímo do hardwarových registrů, a ne výpočetní stav hardwaru za běhu. Při použití objektů psO se režijní náklady na volání kreslení výrazně snižují a na každý rámec může dojít k mnoha dalším voláním kreslení. Další informace o objektech psOs najdete v tématu Správa stavu kanálu grafiky vDirect3D 12 .
Seznamy příkazů a sady
V Direct3D 11 se veškeré odeslání práce provádí prostřednictvím okamžitého kontextu, který představuje jeden datový proud příkazů, které přejdou na GPU. Pro dosažení vícevláknového škálování mají hry také odložené kontexty k dispozici. Odložené kontexty v Direct3D 11 se nemapují dokonale na hardware, takže v nich lze provádět relativně málo práce.
Direct3D 12 zavádí nový model pro odeslání práce na základě seznamů příkazů, které obsahují celé informace potřebné ke spuštění konkrétní úlohy na GPU. Každý nový seznam příkazů obsahuje informace, jako je psO k použití, jaké prostředky textury a vyrovnávací paměti jsou potřeba, a argumenty pro všechna volání kreslení. Vzhledem k tomu, že každý seznam příkazů je samostatný a dědí žádný stav, může ovladač předem vypočítat všechny potřebné příkazy GPU předem a bez vláken. Jediným sériovým procesem je konečné odeslání seznamů příkazů do GPU prostřednictvím fronty příkazů.
Kromě seznamů příkazů představuje Direct3D 12 také druhou úroveň předpočítací práce: svazky. Na rozdíl od seznamů příkazů, které jsou zcela samostatné a obvykle se vytvářejí, odesílají jednou a zahodí, sady poskytují formu dědičnosti stavu, která umožňuje opakované použití. Pokud například hra chce nakreslit dva znakové modely s různými texturami, jedním z přístupů je zaznamenat seznam příkazů se dvěma sadami identických volání kreslení. Ale dalším přístupem je "zaznamenat" jeden balíček, který nakreslí jeden znakový model, a pak "přehrát" sadu dvakrát v seznamu příkazů pomocí různých prostředků. V druhém případě musí ovladač displeje vypočítat pouze příslušné pokyny jednou a vytvoření seznamu příkazů v podstatě odpovídá dvěma voláním funkce s nízkými náklady.
Další informace o seznamech příkazů a sadách najdete v tématu Odeslání práce vDirect3D 12 .
Haldy a tabulky popisovače
Vazby prostředků v Direct3D 11 jsou vysoce abstraktní a pohodlné, ale mnoho moderních hardwarových funkcí je nedostatečně využité. V Direct3D 11 hry vytvářejí zobrazení objekty prostředků a pak svázají tato zobrazení s několika sloty v různých fázích shaderu v kanálu. Shadery zase čtou data z těchto explicitních slotů vazby, které jsou pevné při kreslení. Tento model znamená, že pokaždé, když hra bude kreslit pomocí různých zdrojů, musí znovu svázat různá zobrazení s různými sloty a znovu volat kreslení. Tento případ také představuje režijní náklady, které je možné eliminovat tím, že plně využívá moderní hardwarové funkce.
Direct3D 12 změní model vazby tak, aby odpovídal modernímu hardwaru a výrazně zlepšuje výkon. Místo vyžadování samostatných zobrazení prostředků a explicitního mapování na sloty poskytuje Direct3D 12 haldu popisovače, do které hry vytvářejí různá zobrazení zdrojů. Toto schéma poskytuje mechanismus pro GPU, který přímo zapisuje popis hardwarově nativního prostředku (popisovač) do paměti předem. Chcete-li deklarovat, které prostředky má kanál použít pro konkrétní volání losování, hry určují jednu nebo více tabulek popisovače, které představují dílčí rozsahy haldy plného popisovače. Vzhledem k tomu, že halda popisovače už byla naplněna příslušnými daty popisovače specifické pro hardware, změna tabulek deskriptoru je extrémně nízkonákladová operace.
Kromě vylepšeného výkonu nabízeného haldami a tabulkami popisovače umožňuje Direct3D 12 také dynamicky indexovat prostředky ve shaderech, které poskytují nevídanou flexibilitu a odemykají nové techniky vykreslování. Například moderní odloženého vykreslovacího modulu obvykle kódují nějaký identifikátor materiálu nebo objektu do přechodné vyrovnávací paměti g. V Direct3D 11 musí být tyto motory opatrní, aby se zabránilo použití příliš mnoha materiálů, protože zahrnutí příliš mnoho do vyrovnávací paměti g může výrazně zpomalit konečný průchod vykreslení. S dynamicky indexovatelnými prostředky lze scénu s tisíci materiály dokončit stejně rychle jako jednu s pouze deseti prostředky.
Další informace o haldách a tabulkách popisovače naleznete v tématu vazby prostředkůa rozdíly v vazbovém modelu z Direct3D 11.
Přenos z Direct3D 11
Přenos z Direct3D 11 je zahrnutý proces popsaný v portování z Direct3D 11 do Direct3D 12. Podívejte se také na rozsah možností v Práce s Direct3D 11, Direct3D 10 a Direct2D.
Související témata