Graafikaseadme liides (GDI) on Microsoft Windowsi põhikomponent ja API, mida kasutatakse 2D-graafiliste objektide joonistamiseks ning nende edastamiseks väljundseadmetele nagu printerid ja monitorid. GDI pakub seadme- ja riistvarast sõltumatut kihti, mis võimaldab rakendustel joonistada jooni, kujundeid, teksti ja bitmape ilma, et programm peaks tundma iga konkreetse seadme madala taseme detaile.

Põhiomadused ja funktsioonid

GDI vastutab mitmete tavaliste graafikatööde eest, näiteks:

  • joonte, kõverate ja ristkülikute joonistamine;
  • fontide renderdamine ja teksti väljund (nt DrawText, TextOut);
  • bitmappide kopeerimine ja teisaldamine (BitBlt, StretchBlt);
  • värvipalettide ja värvirežiimide haldamine;
  • klippimise ja regionide kasutamine keerukamate jooniste piiramiseks;
  • metafailide (WMF/EMF) genereerimine ja kasutamine trüki- ning spooling-töös.

GDI ei joonista tavaliselt otse akende kasutajaliidese komponente (menüüd, akna raamid jne) — sellel põhineb kõrgem aluskiht, mis haldab akende ja kasutajaliidese elementide tegelikku joonistamist.

GDI objektid ja seadme-kontekstid

Põhimõtteliselt töötab GDI läbi seadmekonteksti (Device Context, HDC) ja mitme tüüpi GDI-objektide abil, mida rakendus loob ja valib konteksti:

  • pliiatsid (pens) joone omaduste jaoks;
  • pintslid (brushes) täitmiseks;
  • fontid (fonts) teksti jaoks;
  • bitmapi objektid piltide hoidmiseks;
  • regionid ja teed (paths) keerukamate kujundite jaoks.

Seadmekontekst sisaldab informatsiooni skaleerimise, koordinaatsüsteemi, värviruumide ja klippimise kohta ning võimaldab sama joonistusloogikat rakendada erinevatele seadmetele.

Seadmete abstraktsioon ja printimine

Üks GDI suurimaid eeliseid on seadmete abstraktsioon: sama joonistusloogika saab reprodutseeruda nii ekraanil kui ka printeril. Trükkimise puhul kasutatakse sageli vektorpõhist spoolimist (EMF), kus GDI kõnesid salvestatakse spool-faili ja seejärel printeridraiver teisendab need printerile sobivaks väljundiks. See tagab WYSIWYG-tüüpi tulemuse paljude rakenduste jaoks.

Piirangud ja millal valida teised tehnoloogiad

GDI on võimas 2D-API, kuid tal on piirangud, mis teevad selle sobimatuks tänapäevaste nõudlike graafikarakenduste jaoks:

  • puudub riistvareline 3D-kiirendus ja 3D rasteriseerimine — seetõttu pole sobiv keerukate 3D- või intensiivsete mängumootorite jaoks;
  • puudub raamipuhvri sünkroniseerimise mõiste (vt võrdlus DirectXi ja OpenGLi kasutamisega), mis raskendab sujuvat animatsiooni ja kõrge kaadrisagedusega joonistamist;
  • GDI opsioonide riistvariline aktseleratsioon on piiratud ja varieerub Windowsi versiooniti — suurem osa töötlusest toimub CPU-l;
  • GDI-objektide lekkimine (mittevabanenud HDC, pensid, pintslid jms) võib viia süsteemi GDI-sessiooni ressursside ammendumiseni — iga protsessi GDI-objektide arv on piiratud;
  • võrreldes uuemate API-dega (näiteks Direct2D, DirectWrite, GDI+) on puuduvad kaasaegsed funktsioonid nagu sujuv alfa-blending, anti-aliasing vektoritele ja täpsem pilditöötlus.

GDI+

GDI+ on GDI täiendav raamatukogu, mis lisab parema toe alfa-kanalile, gradiente, pildiformaatidele (JPEG, PNG), kõrgema kvaliteediga anti-aliasingu ja lihtsama objektorienteeritud liidese. GDI+ on mugavam arendajale, kuid see ei muuda täielikult GDI põhilisi jõudlus- ja aktseleratsioonipiiranguid.

Tänapäevased alternatiivid

Tänapäeval, kui on vaja sujuvat animatsiooni, riistvarakiirendust või keerukat 2D/3D-graafikat, eelistavad arendajad tihti järgmisi lahendusi:

  • Direct2D ja DirectWrite — 2D-joonistus ja tekstirenderdamine, riistvarakiirendusega;
  • DirectX (sh Direct3D) — mängude ja interaktiivse 3D-sisu jaoks;
  • OpenGL või Vulkan — platvormideülene riistvarapõhine 3D-graafika;
  • kõrgema taseme raamistike ja C#/.NET puhul GDI+ (System.Drawing) või uuemates lahendustes spetsiaalsed teegid.

Hea praktika arendajale

  • vähenda SelectObject kutsumisi ja vali tagasi algsed GDI-objektid enne vabastamist;
  • kasuta topeltpuhverdust (double buffering) vilkumise vältimiseks;
  • vabasta alati GDI-ressursid (pensid, pintslid, bitmapi objektid, HDC) et vältida lekkimist;
  • prügi GDI-d intensiivsetes reaalajas graafikaülesannetes — eelistada Direct2D/Direct3D, kui vaja riistvarakiirendust;
  • testi trüki- ja ekraaniväljundit erinevates seadmetes, kuna värviruumid ja resolutsioonid võivad erineda.

Lihtsad mängud ja rakendused, mis ei nõua kõrget kaadrisagedust ega 3D-funktsionaalsust, kasutavad sageli GDI-d. Kuid tänapäevaste mängude ja graafikaliselt nõudlike rakenduste puhul kasutatakse tavaliselt DirectXi või OpenGLi (või nende järglasi), mis annavad arendajatele otsese ligipääsu kaasaegse riistvara võimsusele.