Porovnání hardwarové akcelerace Direct2D a GDI
Direct2D a GDI jsou obě rozhraní API pro 2D vykreslování v okamžitém režimu a obě nabízejí určitý stupeň hardwarové akcelerace. Toto téma zkoumá rozdíly mezi rozhraními Direct2D a GDI, včetně minulých a přítomen rozdílů ve funkcích hardwarové akcelerace obou rozhraní API.
Toto téma obsahuje následující části:
- Rozdíly mezi Direct2D a GDI
- hardwarová akcelerace GDI a Direct2D
- vykreslování GDI ve Windows 7
- Porovnání akcelerace Direct2D a GDI ve Windows 7
- závěr
Rozdíly mezi Direct2D a GDI
GDI vykresluje neprůzraké, aliasované geometrie, jako jsou mnohoúhelníky, elipsy a čáry. Vykreslí aliasovaný text a text ClearType a může podporovat prolnutí průhlednosti prostřednictvím rozhraní AlphaBlend API. Zpracování transparentnosti je však nekonzistentní a většina rozhraní API GDI jednoduše ignoruje alfa kanál. Jen několik rozhraní API GDI zaručuje, co bude alfa kanál obsahovat po operaci. Ještě důležitější je, že vykreslování GDI se nemapuje snadno na 3D operace a moderní GPU vykresluje nejefektivněji na 3D část svého vykreslovacího enginu. Například Direct2Daliasované čáry jsou navrženy tak, aby se implementovaly jednoduše jako dva trojúhelníky vykreslené na GPU, zatímco GDI používá Bresenhamův algoritmus kreslení čar.
Direct2D vykresluje neprůhledné, průhledné, aliasované a antialiasované primitivy. Moderní uživatelská rozhraní často využívají průhlednost a animaci. Direct2D usnadňuje vytvoření moderního uživatelského rozhraní, protože má přísné záruky toho, jak přijímá a vykresluje transparentní obsah, a všechny jeho primitivy se vykreslují pomocí hardwarové akcelerace. Direct2D není čistě nadmnožina GDI: primitiva, která by byla nepřiměřeně pomalá při implementaci na GPU, v Direct2D nejsou přítomna. Vzhledem k tomu, že Direct2D je postaven s tímto důrazem na 3D akceleraci, je také snadné ji používat s Direct3D.
Vzhledem k tomu, že systém Windows NT 4, GDI běží v režimu jádra. Aplikace volá GDI, která pak volá jeho protějšk režimu jádra, který předává primitivy do vlastního modelu ovladače. Tento ovladač pak odešle výsledky do ovladače zobrazení globálního režimu jádra.
Počínaje systémem Windows 2000 GDI a ovladače GDI běží v nezávislém prostoru v jádru s názvem "prostor relace". Pro každou přihlašovací relaci se vytvoří adresní prostor relace a každá instance GDI se spouští nezávisle v tomto jedinečném adresního prostoru v režimu jádra. Direct2D však běží v uživatelském režimu a předává příkazy kreslení prostřednictvím ovladače Direct3D uživatelského režimu do ovladače režimu jádra.
GDI
Hardwarová akcelerace GDI a Direct2D
Nejdůležitější rozdíl mezi direct2D a GDI hardwarovou akcelerací je základní technologie, která je řídí. Direct2D je vrstvený na vrcholu Direct3D a GDI má svůj vlastní model ovladače, rozhraní ovladače zařízení GDI (DDI), které odpovídá primitivům GDI. Model ovladače Direct3D odpovídá tomu, co vykresluje 3D hardware v GPU. Při prvním definování rozhraní GDI DDI se většina hardwaru akcelerace zobrazení zaměřuje na primitivy GDI. V průběhu času byl kladen stále větší důraz na zrychlení 3D her a méně na zrychlení aplikací. V důsledku toho bylo rozhraní API BitBlt akcelerované hardwarem a většina ostatních operací GDI nebyla.
Tím se nastavilo prostředí pro posloupnost změn toho, jak GDI vykresluje na displej. Následující obrázek ukazuje, jak se vykreslování zobrazení GDI změnilo z Windows XP na Windows 7.
Také došlo k řadě dalších faktorů, které způsobily změny modelu GDI, jak je uvedeno níže.
Zvýšení složitosti a velikosti ovladačů zobrazení
3D ovladače jsou v průběhu času složitější. Složitější kód má tendenci mít více vad, což je přínosné pro to, aby ovladač existoval v uživatelském režimu, kdy chyba ovladače nemůže způsobit restartování systému. Jak je vidět na obrázku výše, ovladač zobrazení je rozdělen do komplexní komponenty uživatelského režimu a jednodušší komponenta režimu jádra.
Potíže se synchronizací relací a globálních adresních prostorů jádra
V systému Windows XP existuje grafický ovladač ve dvou různých adresních prostorech: prostor relace a prostor jádra. Části řidiče musí reagovat na události, jako jsou události řízení spotřeby. Toto musí být synchronizováno se stavem ovladače v adresovém prostoru relace. Jedná se o obtížnou úlohu a může vést k vadám, když se grafické ovladače pokoušejí vypořádat s různými adresními prostory.
Správa složených oken
Správce oken plochy (DWM), správce okna pro vytváření sestav zavedený ve Windows 7, vykresluje všechna okna na povrchy mimo obrazovku a potom je sestavuje společně, aby se zobrazily na obrazovce. To vyžaduje, aby GDI mohl vykreslit na povrch, který pak Direct3D vykreslí na displej. To způsobilo problém v modelu ovladačů XP, protože GDI a Direct3D byly paralelní vrstvy ovladačů.
V důsledku toho byl v systému Windows Vista implementován ovladač zobrazení GDI DDI, protože společnost Microsoft poskytla Canonical Display Driver (CDD), který vykresloval obsah GDI na rastrovou kopii systémové paměti, která se má skládat na obrazovku.
Vykreslování GDI ve Windows 7
Model ovladače použitý v systému Windows Vista vyžadoval, aby každé GDI okno bylo podporováno jak povrchem videopaměti, tak systémovým paměťovým povrchem. Výsledkem je použití systémové paměti pro každé okno GDI.
Z tohoto důvodu se GDI změnila znovu ve Windows 7. Místo vykreslení na plochu systémové paměti byla GDI upravena tak, aby se vykreslovala do segmentu paměti s clonou. Paměť na clonu lze aktualizovat z plochy paměti videa, která drží obsah okna. GDI se může vykreslit zpět do paměti clony a výsledek pak může být odeslán zpět na plochu okna. Vzhledem k tomu, že segment paměti apertury je adresovatelný GPU, může GPU urychlit tyto aktualizace na povrchu videopaměti. Například vykreslování textu, BitBlts, AlphaBlend, TransparentBlt a StretchBlt jsou v těchto případech akcelerované.
Porovnání akcelerace Direct2D a GDI ve Windows 7
Rozhraní Direct2D a GDI jsou obě rozhraní API pro okamžité vykreslování v režimu 2D a jsou hardwarově akcelerovaná. Existuje však řada rozdílů, které zůstávají v obou rozhraních API.
Umístění prostředků
GDI udržuje své prostředky, zejména rastrové obrázky, ve výchozím nastavení v systémové paměti. Direct2D udržuje své prostředky v paměti videa na grafickém adaptéru. Pokud GDI potřebuje aktualizovat paměť videa, musí to být provedeno přes sběrnici, pokud prostředek již není v segmentu apertury paměti nebo pokud lze operaci vyjádřit přímo. Naproti tomu Direct2D může jednoduše přeložit své primitivy na primitiva Direct3D, protože prostředky jsou již v paměti videa.
Metoda vykreslování
Aby se zachovala kompatibilita, GDI provádí velkou část svého vykreslování do paměti s otvory pomocí procesoru. Naproti tomu Direct2D překládá volání rozhraní API do primitiv Direct3D a operací kreslení. Výsledek se pak vykreslí na GPU. Některé vykreslování GDI se provádí na GPU, když je paměť zkopírována na povrch videopaměti představující okno GDI.
Škálovatelnost
Volání vykreslování Direct2Djsou nezávislé příkazové toky pro GPU. Každá továrna Direct2D představuje jiné zařízení Direct3D. GDI používá jeden datový proud příkazů pro všechny aplikace v systému. Metoda GDI může vést k nárůstu režie kontextu vykreslování GPU a CPU.
Umístění
Direct2D funguje zcela v uživatelském režimu, včetně běhového prostředí Direct3D a ovladače Direct3D v uživatelském režimu. To pomáhá zabránit selháním systému způsobeným vadami kódu v jádru. GDI, ale má většinu své funkčnosti v prostoru relace v režimu jádra a rozhraní API je v uživatelském režimu.
Dostupnost hardwarové akcelerace
GDI je hardwarově akcelerovaný v systému Windows XP a akceleruje se v systému Windows 7, když je spuštěn Správce desktopových oken a používá se ovladač WDDM 1.1. Direct2D je hardwarově akcelerovaný na téměř každém ovladači WDDM, a to bez ohledu na to, zda se používá DWM. V systému Vista se GDI vždy vykresluje na procesoru.
Prezentační model
Při prvním návrhu systému Windows nebylo dostatek paměti, aby bylo možné ukládat každé okno do vlastního rastrového obrázku. V důsledku toho GDI vždy vykreslovány logicky přímo na obrazovku s různými oblastmi výřezů, aby se zajistilo, že aplikace nevykreslila mimo jeho okno. V modelu Direct2D se aplikace vykreslí do vyrovnávací paměti a výsledek se zobrazí, když aplikace dokončí kreslení. Díky tomu může Direct2D zpracovávat scénáře animací mnohem plynulejším způsobem, než může GDI.
Závěr
Stávající kód GDI bude fungovat dobře v systému Windows 7. Při psaní nového grafického vykreslovacího kódu by se ale Direct2D měli brát v úvahu, protože využívá lepší výhod moderních grafických procesorů.