Direct2D és GDI hardveres gyorsítás összehasonlítása
Direct2D és GDI egyaránt azonnali 2D renderelési API-k, és mindkettő némi hardvergyorsítást kínál. Ez a témakör a Direct2D és a GDI közötti különbségeket mutatja be, beleértve a két API hardveres gyorsítási funkcióinak múltbeli és jelenlegi különbségeit is.
Ez a témakör a következő részekből áll:
- A Direct2D és a GDI közötti különbségek
- GDI és Direct2D hardveres gyorsítás
- GDI-megjelenítés a Windows 7-ben
- Direct2D és GDI gyorsítás összehasonlítása Windows 7-ben
- Következtetés
A Direct2D és a GDI közötti különbségek
GDI átlátszatlan, aliasos geometriákat, például sokszögeket, három pontot és sort jelenít meg. Aliasos és ClearType-szöveget jelenít meg, és az AlphaBlend API-n keresztül támogatja az átlátszóság keverését. Az átláthatóság kezelése azonban inkonzisztens, és a legtöbb GDI API egyszerűen figyelmen kívül hagyja az alfa csatornát. Kevés GDI API garantálja, hogy az alfa csatorna mit fog tartalmazni egy művelet után. Ami még fontosabb, a GDI renderelése nem felel meg könnyen a 3D-műveleteknek, és a modern GPU a leghatékonyabban a renderelő motor 3D-s részén renderel. Például Direct2Daliasos vonalait úgy tervezték, hogy egyszerűen két háromszögként legyenek implementálva a GPU-n, míg a GDI Bresenham vonalrajz-algoritmusát használja.
Direct2D átlátszatlan, átlátszó, aliasolt és élsimított primitíveket jelenít meg. A modern felhasználói felületek gyakran használják az átláthatóságot és az animációt. A Direct2D megkönnyíti a modern felhasználói felület létrehozását, mivel szigorú garanciákat biztosít arra nézve, hogyan fogadja el és rendereli az áttetsző tartalmat, és minden primitívjét hardveres gyorsítással jeleníti meg. A Direct2D nem a GDItiszta szuperhalmaza: a GPU-n való implementáláskor indokolatlanul lassú primitívek nem jelennek meg a Direct2D-ben. Mivel a Direct2D ezzel a hangsúlyt fektet a 3D gyorsításra, a Direct3D-vel is könnyen használható.
A Windows NT 4 óta GDI kernel módban fut. Az alkalmazás meghívja a GDI-t, amely meghívja a kernel módú megfelelőjét, amely átadja a primitíveket a saját illesztőprogram-modelljének. Ez az illesztőprogram ezután elküldi az eredményeket a globális kernel mód megjelenítési illesztőprogramjának.
A Windows 2000-től kezdve GDI- és a GDI-illesztőprogramok egy független térben futnak a kernelben, úgynevezett "munkamenet-térben". Minden bejelentkezési munkamenethez létrejön egy munkamenet-címtér, és a GDI minden példánya egymástól függetlenül fut ebben a különálló kernelmódú címtérben. A Direct2D azonban felhasználói módban fut, és a felhasználói módú Direct3D-illesztőn keresztül továbbítja a rajzparancsokat a kernel módú illesztőprogramnak.
GDI és Direct2D hardveres gyorsítás
A Direct2D és GDI hardveres gyorsítása között a legfontosabb különbség az őket meghajtó mögöttes technológia. A Direct2D a felső Direct3D-n van rétegezve, és a GDI saját illesztőprogram-modellel rendelkezik, a GDI eszközillesztő felületével (DDI), amely megfelel a GDI primitívjeinek. A Direct3D-illesztőmodell megfelel a GPU 3D renderelési hardverének. A GDI DDI első definiálásakor a legtöbb megjelenítési gyorsítási hardver a GDI-primitíveket célozta meg. Idővel egyre nagyobb hangsúlyt fektettek a 3D-s játékgyorsításra, és kevésbé az alkalmazásgyorsításra. Ennek következtében a BitBlt API hardveresen felgyorsult, és a többi GDI-művelet nem.
Ez előkészítette a terepet a GDI megjelenítésére vonatkozó változások sorozatához. Az alábbi ábra bemutatja, hogyan változott a GDI-megjelenítés Windows XP-ről Windows 7-re.
Számos további tényező is okozott változásokat a GDI illesztőprogram-modellben, az alábbiakban leírtak szerint.
A megjelenítési illesztőprogramok összetettségének és méretének növelése
A térhatású illesztőprogramok idővel összetettebbé váltak. Az összetettebb kód általában több hibával rendelkezik, így előnyös, ha az illesztőprogram felhasználói módban létezik, ahol az illesztőprogram hibája nem okozhat rendszer újraindítást. A fenti ábrán látható módon a megjelenítési illesztő egy összetett felhasználói módú összetevőre és egy egyszerűbb kernelmódú összetevőre van osztva.
A munkamenet és a globális kernelcímterek szinkronizálásának nehézségei
Windows XP rendszerben egy megjelenítési illesztőprogram két különböző címtérben létezik: munkamenet-hely és kerneltér. Az illesztőprogram egyes részeinek reagálnia kell az olyan eseményekre, mint az energiagazdálkodási események. Ezt szinkronizálni kell a munkamenet címterében található illesztőprogram-állapottal. Ez nehéz feladat, és hibákhoz vezethet, amikor a megjelenítési illesztőprogramok megpróbálják kezelni ezeket a különböző címtereket.
Összetett ablakkezelés
A Windows 7-ben bevezetett összeállítási ablakkezelő, a Desktop Window Manager (DWM) megjeleníti az összes ablakot a képernyőn kívüli felületekre, majd összeírja őket, hogy megjelenjenek a képernyőn. Ehhez GDI- kell renderelni egy felületre, amelyet a Direct3D megjelenít. Ez problémát okozott az XP-illesztőmodellben, mivel a GDI és a Direct3D párhuzamos illesztőprogram-vermek voltak.
Ennek eredményeképpen Windows Vista rendszerben a GDI DDI-megjelenítési illesztőprogram a Microsoft által biztosított Canonical Display Driver (CDD) eszközként lett implementálva, amely a GDI-tartalmat egy rendszermemória bitképére renderelte, hogy a képernyőhöz legyen összeállítva.
GDI-renderelés a Windows 7-ben
A Windows Vista rendszerben használt illesztőprogram-modell megkövetelte, hogy minden GDI- ablakhoz videomemória-felület és rendszermemória-felület is tartozzon. Ez azt eredményezte, hogy minden GDI-ablakban rendszermemória lett használva.
Ezért GDI- windows 7-ben újra módosult. Ahelyett, hogy rendszermemóriára renderelt volna, a GDI-t úgy módosították, hogy egy apertúrás memóriaszegmensre rendereljen. Az apertúramemória frissíthető az ablak tartalmát tartalmazó videomemória felületéről. A GDI vissza tudja adni a megnyíló memóriába, és az eredményt ezután vissza lehet küldeni az ablak felületére. Mivel az apertúra memóriaszegmensét a GPU kezeli, a GPU felgyorsíthatja ezeket a frissítéseket a videomemória felületén. Ezekben az esetekben például a szövegmegjelenítés, a BitBlts, az AlphaBlend, a TransparentBlt és a StretchBlt is felgyorsul.
A Direct2D és a GDI gyorsításának összehasonlítása a Windows 7-ben
Direct2D és GDI egyaránt 2D azonnali módú renderelési API-k, és hardveresen gyorsítottak. A két API-ban azonban számos különbség van.
Az erőforrások helye
GDI- alapértelmezés szerint a rendszermemóriában tartja fenn az erőforrásait, különösen a bitképeket. Direct2D a videomemória erőforrásait a megjelenítési adapteren tartja fenn. Ha a GDI-nek frissítenie kell a videomemóriát, ezt a buszon keresztül kell elvégezni, kivéve, ha az erőforrás már szerepel az apertúra memóriaszegmensében, vagy ha a művelet közvetlenül kifejezhető. Ezzel szemben a Direct2D egyszerűen lefordíthatja a primitíveket Direct3D primitívekre, mivel az erőforrások már a videómemóriában vannak.
Renderelési módszer
A kompatibilitás fenntartása érdekében a GDI renderelésének nagy részét az apertúra-memóriában a processzor használatával végzi. Ezzel szemben a Direct2D az API-hívásait Direct3D primitívekre és rajzműveletekre alakítja át. Az eredmény ezután megjelenik a GPU-n. A GDI-renderelés egy része a GPU-n történik, amikor a rendszer átmásolja a rekeszi memóriát a GDI-ablakot képviselő videomemória felületére.
Méretezhetőség
Direct2Drenderelési hívásai mind független parancsstreamek a GPU számára. Minden Direct2D-gyár egy másik Direct3D-eszközt jelöl. GDI- egy parancsstreamet használ a rendszeren lévő összes alkalmazáshoz. A GDI metódusa a GPU és a PROCESSZOR renderelési környezetének többletterhelését eredményezheti.
Helyszín
Direct2D teljes mértékben felhasználói módban működik, beleértve a Direct3D futási idejét és a felhasználói mód Direct3D-illesztőjét. Ez segít megelőzni a rendszer összeomlását, amelyet a kernel kódhibái okoznak. GDI-azonban a legtöbb funkcióját kernel módban használja a munkamenet-térben, és az API felülete felhasználói módban van.
A hardveres gyorsítás rendelkezésre állása
GDI- hardveresen gyorsított Windows XP-n, és akkor gyorsított Windows 7-en, amikor a Desktop Window Manager fut, és egy WDDM 1.1 driver van használatban. A Direct2D szinte bármilyen WDDM-illesztőprogramon hardveresen gyorsított, függetlenül attól, hogy a DWM használatban van-e. Vista esetén a GDI mindig a processzoron jelenik meg.
Bemutatómodell
A Windows első tervezésekor nem volt elegendő memória ahhoz, hogy minden ablak a saját bitképén legyen tárolva. Ennek eredményeképpen GDI- mindig logikusan, közvetlenül a képernyőn jelenik meg, és különböző kivágási régiókat alkalmaztak annak biztosítására, hogy egy alkalmazás ne jelenhessen meg az ablakán kívül. A Direct2D modellben egy alkalmazás egy háttérpufferbe renderel, és az eredmény akkor jelenik meg, amikor az alkalmazás elkészült a rajzolással. Ez lehetővé teszi, hogy a Direct2D sokkal folyékonyabban kezelje az animációs forgatókönyveket, mint a GDI.
Következtetés
A meglévő GDI- kód továbbra is jól működik a Windows 7 rendszerben. Új grafikus renderelési kód írásakor azonban figyelembe kell venni Direct2D, mivel jobban kihasználja a modern GPU-kat.