Gränssnitt för grafisk enhet
Graphics Device Interface ( GDI ) är en äldre komponent i Microsoft Windows som ansvarar för att representera grafiska objekt och överföra dem till utenheter som bildskärmar och skrivare . Windows-appar använder Windows API för att interagera med GDI, för sådana uppgifter som att rita linjer och kurvor, rendera teckensnitt och hantera paletter . Windows USER - undersystemet använder GDI för att rendera sådana UI-element som fönsterramar och menyer. Andra system har komponenter som liknar GDI; till exempel: macOS har Quartz , och Linux har X Window System och Wayland (visningsserverprotokoll) .
GDI:s viktigaste fördelar jämfört med mer direkta metoder för att komma åt hårdvaran är kanske dess skalningsmöjligheter och dess abstrakta representation av målenheter. Med GDI är det möjligt att rita på flera enheter, såsom en skärm och en skrivare, och förvänta sig korrekt reproduktion i varje enskilt fall. Denna funktion är i centrum för de flesta " What You See Is What You Get "-applikationer för Microsoft Windows.
Enkla spel som inte kräver snabb grafikåtergivning kan använda GDI. GDI är dock relativt svår att använda för avancerad animering, saknar en idé om att synkronisera med individuella videoramar i grafikkortet och saknar hårdvarurastrering för 3D. Moderna spel använder vanligtvis DirectX , Vulkan eller OpenGL istället.
Tekniska detaljer
I GDI definierar en enhetskontext (DC) attributen för text och bilder för utenheten, t.ex. skärm eller skrivare. GDI upprätthåller det faktiska sammanhanget. Att generera utdata kräver ett handtag till enhetskontexten (HDC). Efter generering av utgången kunde handtaget släppas.
GDI använder Bresenhams linjeritningsalgoritm för att rita aliaslinjer.
Versionshistorik
Tidiga versioner
GDI var närvarande i den första versionen av Windows. MS-DOS-program hade hittills manipulerat grafikhårdvaran med mjukvaruavbrott (ibland via Video BIOS ) och genom att manipulera videominnet direkt. Kod skriven på det här sättet förväntar sig att det är den enda användaren av videominnet, vilket inte var hållbart i multi-tasked miljö, såsom Windows. Tidningen BYTE diskuterade i december 1983 Microsofts planer på ett system för att mata ut grafik till både skrivare och bildskärmar med samma kod i den kommande första versionen av Windows.
Windows XP
Med introduktionen av Windows XP kompletterade GDI+ GDI . GDI+ har skrivits i C++. Den lägger till kantutjämnad 2D-grafik, flyttalskoordinater, gradientskuggning, mer komplex väghantering, inbyggt stöd för moderna grafikfilformat som JPEG och PNG och stöd för sammansättning av affina transformationer i 2D-vypipeline. GDI+ använder RGBA- värden för att representera färg. Användningen av dessa funktioner är uppenbar i Windows XP-komponenter, som Microsoft Paint , Windows Bild- och faxvisare , Fotoutskriftsguiden och skärmsläckaren Mina bilder Slideshow. Deras närvaro i det grundläggande grafiklagret förenklar avsevärt implementeringar av vektorgrafiksystem som Adobe Flash eller SVG . Dessutom .NET Framework ett hanterat gränssnitt för GDI+ via namnområdet System.Drawing
.
Medan GDI+ ingår i Windows XP och senare, kan det dynamiska biblioteket GDI+ också levereras med en applikation och användas på äldre versioner av Windows.
På grund av de extra funktionerna för textbearbetning och upplösningsoberoende i GDI+, utför CPU:n textåtergivning. Resultatet är en storleksordning långsammare än den hårdvaruaccelererade GDI. Chris Jackson publicerade några tester som indikerade att ett stycke textåtergivningskod han hade skrivit kunde återge 99 000 glyfer per sekund i GDI, men samma kod med GDI+ återgav 16 600 glyfer per sekund.
GDI+ liknar (i syfte och struktur) Apples QuickDraw GX- undersystem och biblioteken med öppen källkod libart och Kairo .
Windows Vista
I Windows Vista körs alla Windows-applikationer inklusive GDI- och GDI+-applikationer i den nya kompositmotorn, Desktop Window Manager (DWM), som är hårdvaruaccelererad. Som sådan är GDI själv inte längre hårdvaruaccelererad. På grund av kompositionsoperationernas karaktär kan fönsterflyttningar vara snabbare eller mer lyhörda eftersom underliggande innehåll inte behöver renderas om av programmet.
Windows 7
Windows 7 inkluderar GDI-hårdvaruacceleration för bliteringsoperationer i Windows Display Driver Model v1.1 . Detta förbättrar GDI-prestandan och tillåter DWM att använda lokalt videominne för kompositering, vilket minskar systemets minnesfotavtryck och ökar prestanda för grafikoperationer. De flesta primitiva GDI-operationer är fortfarande inte hårdvaruaccelererade, till skillnad från Direct2D . GDI+ fortsätter att förlita sig på mjukvarurendering i Windows 7.
GDI-skrivare
En GDI-skrivare eller Winprinter (analogt med ett Winmodem ) är en skrivare som är utformad för att acceptera utdata från en värddator som kör Windows. Värddatorn gör all utskriftsbehandling: GDI återger en sida som en bitmapp, som skrivardrivrutinen tar emot, bearbetar och skickar till den associerade skrivaren. Kombinationen av GDI och drivrutinen är dubbelriktad; de får information från skrivaren som om den är redo att skrivas ut eller om papper är slut.
Skrivare som inte är beroende av GDI kräver hårdvara, firmware och minne för sidrendering medan en GDI-skrivare använder värddatorn för detta. En skrivare med ett eget kontrollspråk kan dock acceptera inmatning från vilken enhet som helst med en lämplig drivrutin, medan en GDI-skrivare kräver en PC som kör Windows. GDI-skrivare kan göras tillgängliga för datorer i ett nätverk om de är anslutna som delade skrivare på en dator som är på och kör Windows. Vissa "generiska" GDI-drivrutiner som pnm2ppa
har skrivits; de syftar till att göra GDI-skrivare kompatibla med icke-Windows-operativsystem som FreeBSD , men de kan inte stödja alla skrivare.
För att möjliggöra enklare skapande av drivrutiner för Winprinters skapades Microsoft Universal Printer Driver . Detta tillåter skrivarleverantörer att skriva Generic Printer Description (GPD) "minidrivrutiner", som beskriver skrivarens kapacitet och kommandouppsättning i klartext, snarare än att behöva utveckla drivrutiner i kärnläge.
Microsoft har gått bort från denna utskriftsmodell med Open XML Paper Specification .
Begränsningar
Varje fönster förbrukar GDI-objekt. När fönstrets komplexitet ökar, med ytterligare funktioner som knappar och bilder, ökar också användningen av GDI-objekt. När alltför många objekt används kan Windows inte rita fler GDI-objekt, vilket leder till att programvaran inte beter sig och att programmet inte fungerar. Många applikationer är också felaktigt kodade och misslyckas med att släppa GDI-objekt efter användning, vilket ytterligare ökar problemet. Det totala antalet tillgängliga GDI-objekt varierar från en version av Windows till nästa: Windows 9x hade en gräns på totalt 1 200 objekt; Windows 2000 har en gräns på 16 384 objekt; och Windows XP och senare har en konfigurerbar gräns (via registret) som är standard till 10 000 objekt per process (men ett teoretiskt maximum på 65 536 för hela sessionen). Windows 8 och senare ökar GDI-objektgränsen till 65 536 per användarinloggningssession.
Tidigare versioner av Windows som Windows 3.1 och Windows 98 inkluderade ett Resource Meter-program för att göra det möjligt för användaren att övervaka hur mycket av systemets totala GDI-resurser som användes. Denna resursmätare förbrukade GDI-objekt själv. Senare versioner som Windows 2000 och Windows XP kan rapportera GDI-objektanvändning för varje program i Aktivitetshanteraren, men de kan inte berätta för användaren den totala tillgängliga GDI-kapaciteten.
Överfull GDI-kapacitet kan påverka själva Windows, vilket förhindrar att nya fönster öppnas, menyer från att visas och varningsrutor från att visas. Situationen kan vara svår att reda ut och kan potentiellt kräva en påtvingad återställning av systemet, eftersom det hindrar kärnsystemets program från att fungera. I Windows 8 och 8.1 sker en påtvingad utloggning som ett resultat av GDI-kapacitetsspill, istället för en omstart.
Efterträdare
Direct2D är efterföljaren till GDI och GDI+. Dess syskon, DirectWrite , ersätter Uniscribe . De levererades med Windows 7 och Windows Server 2008 R2 och var tillgängliga för Windows Vista och Windows Server 2008 (med Platform Update installerad). Senare utvecklade Microsoft Win2D , ett gratis GDI-liknande klassbibliotek med öppen källkod. Win2Ds målgrupp är utvecklare som använder C++, C# och Visual Basic.NET för att utveckla Universal Windows Platform-appar .