Grafinio įrenginio sąsaja yra "Microsoft Windows" API, naudojama grafiniams objektams atvaizduoti ir perduoti į išvesties įrenginius, pvz., spausdintuvus ir monitorius. GDI suteikia bendrą sluoksnį, leidžiantį programoms piešti linijas, kreives, tekstą ir bitmapas nepriklausomai nuo tikslios įrenginio aparatinės įrangos.
Kas atlieka GDI
GDI atlieka užduotis, tokias kaip linijų ir kreivių braižymas, šriftų atvaizdavimas, bitmapių kopijavimas ir paletės tvarkymas. Ji nėra tiesiogiai atsakinga už langų, meniu ir kitų valdiklių piešimą – šias funkcijas dažnai vykdo aukštesnio lygio posistemos, sukurtos ant GDI. Kitose sistemose yra komponentų, panašių į GDI, pavyzdžiui, "Macintosh" QuickDraw ir GNOME/GTK GDK/Xlib.
GDI architektūra ir pagrindinės sąvokos
- HDC (device context) – pagrindinis GDI objektas, aprašantis, kur ir kaip piešti (ekranas, spausdintuvas, atminties bitmapa). Daugelis GDI funkcijų reikalauja HDC parametro.
- GDI objektai – piešimo elementai, tokie kaip pieštukai (pens), teptukai (brush), šriftai (font), bitmatos (bitmap), regionai (region). Šiuos objektus reikia kurti ir atlaisvinti rankiniu būdu.
- Metodai ir funkcijos – įprastos funkcijos: "MoveToEx", "LineTo", "Rectangle", "Ellipse", "TextOut", taip pat bitblt operacijos kaip "BitBlt" ir "StretchBlt".
- Kartografavimo režimai – koordinatės, mastelis ir transformacijos (skaidai) leidžia GDI abstraguoti nuo konkretaus įrenginio raiškos ir dydžio.
Pagrindiniai privalumai
- Mastelio ir įrenginių abstrakcija – bene svarbiausias GDI pranašumas, palyginti su tiesiogine prieiga prie aparatinės įrangos, yra jo gebėjimas atvaizduoti tas pačias grafines komandas skirtinguose įrenginiuose su tinkamu mastelio ir kokybės pritaikymu. Dėl to gana paprasta piešti tiek ekrane, tiek spausdintuve ir tikėtis, kad abu atvaizdai bus tinkami.
- GDI palaiko spausdinimą per spausdinimo tvarkykles, leidžiančias programoms piešti taip, lyg pieštų ekrane, o tvarkyklė pasirūpina spausdinimo formatu.
- GDI yra paprasta mokytis ir pakankama daugeliui verslo programų ir paprastų žaidimų, kuriems nereikia aukštos spartos grafikos.
Apribojimai ir trūkumai
- Mažas našumas animacijai ir žaidimams – GDI daugiausia vykdo operacijas CPU lygyje ir neturi pažangios sinchronizacijos su kadrų buferiu, todėl skirta ne intensyvioms realaus laiko 3D ar 2D animacijoms.
- Be 3D rasterizavimo – GDI neturi aparatūros pagreitinto 3D palaikymo; sudėtingesnė 3D grafika atliekama per DirectX arba OpenGL.
- Išteklių valdymas – GDI naudoja rankinius valdiklius (HGDIOBJ), kuriuos programuotojas privalo išlaisvinti. Rankų klaidos lemia išteklių nutekėjimus (GDI handle leak) ir gali sulėtinti arba sugadinti sistemą.
- Ribotos modernios grafikos galimybės – trūksta pažangių efektų kaip aparatūrinė kompozicija, tiesioginė alfa kompozicija ar modernios tekstūros priemonės, kurias siūlo naujesnės bibliotekos (pvz., Direct2D, DirectWrite).
Naudojimo sritys ir alternatyvos
Paprastiems programų GUI piešiniams, spausdinimui ir administraciniams įrankiams GDI dažnai vis dar yra pakankama. Tačiau šiuolaikinėse programose ir žaidimuose, kuriems reikia aukšto našumo 2D/3D grafikos, dažniau naudojamos šios alternatyvos:
- "DirectX" – ypač Direct3D, naudojama žaidimams ir aparatūros pagreitintai 3D grafikai.
- OpenGL – platformų kryžminis sprendimas 3D grafikai.
- Direct2D ir DirectWrite – Microsoft sprendimai moderniai, aparatūriškai pagreitintai 2D grafikai ir aukštos kokybės teksto atvaizdavimui.
- GDI+ – platesnės 2D grafikos galimybės (antialiasing, alfa kanalai, gradiento užpildai), suteikiančios patogesnę objektinę sąsają palyginti su klasikiniais GDI skambučiais.
Geros praktikos patarimai programuotojams
- Išleisti išteklius – visada naikinkite sukurti GDI objektus su "DeleteObject" ir išlaisvinkite HDC su "ReleaseDC" ar "DeleteDC", kai jie nebereikalingi.
- Naudokite dvigubą buferiavimą – norint sumažinti mirksėjimą (flicker) valgomas piešimas atliekamas į atminties bitmatą, o po to vienu "BitBlt" kopijuojamas į ekraną.
- Stebėkite GDI rankų skaičių – Windows riboja vienu metu naudojamų GDI rankų skaičių; nutekėjimai gali sukelti našumo problemas.
- Rinkitės tinkamą priemonę – jei jums reikia aparatūrinio pagreitinimo, sklandaus animavimo arba pažangių grafikos efektų, apsvarstykite Direct2D/Direct3D arba kitus modernius API.
Sudėtingesnės temos
GDI palaiko įvairius raster operacijų režimus (ROP kodai), regionų operacijas, paletes ir spalvų konversijas tarp įrenginių. Spausdinimo architektūra dažnai remiasi GDI piešimu į metafailus, kuriuos spausdinimo tvarkyklė vėliau paverčia į spausdintuvo komandas. Dėl šio tarpinio sluoksnio daug programų paprastai „piešia“ tiek ekrane, tiek spausdintuve tą pačią abstrakčią grafiką.
Išvados
GDI yra pamato lygio grafikos API, kuri istoriniu požiūriu užtikrino „Ką matote, tą ir gaunate“ principą daugeliui "Microsoft Windows" programų. Ji vis dar naudinga spausdinimui, paprastiems grafinėms operacijoms ir suderinamumo palaikymui, tačiau moderniai, aparatūrai optimizuotai grafikai dažniau pasirenkami Direct2D, Direct3D ar kiti šiuolaikiniai sprendimai. Žinoti GDI principus naudinga tiek dirbant su senomis programomis, tiek suprantant aukštesnio lygio grafikos sistemų veikimą.