อ่าน 5 นาที
อินเทอร์เฟซอุปกรณ์กราฟิก
อินเทอร์เฟซอุปกรณ์กราฟิก ( GDI ) เป็นส่วนประกอบดั้งเดิมของMicrosoft Windowsที่ทำหน้าที่แสดงผลวัตถุกราฟิกและส่งข้อมูลไปยังอุปกรณ์แสดงผลเช่นจอภาพและเครื่องพิมพ์ ต่อมา...
อินเทอร์เฟซอุปกรณ์กราฟิก


อินเทอร์เฟซอุปกรณ์กราฟิก ( GDI ) เป็นส่วนประกอบดั้งเดิมของMicrosoft Windowsที่ทำหน้าที่แสดงผลวัตถุกราฟิกและส่งข้อมูลไปยังอุปกรณ์แสดงผลเช่นจอภาพและเครื่องพิมพ์ ต่อมา ถูกแทนที่ด้วยDirectDraw API และDirect2D API แอปพลิเคชัน Windows ใช้Windows APIในการโต้ตอบกับ GDI สำหรับงานต่างๆ เช่น การวาดเส้นและเส้นโค้ง การแสดงผลแบบอักษร และการจัดการจานสีระบบย่อย USER ของ Windowsใช้ GDI ในการแสดงผลองค์ประกอบ UI เช่น กรอบหน้าต่างและเมนู ระบบอื่นๆ ก็มีส่วนประกอบที่คล้ายกับ GDI เช่นMac OSมีQuickDrawและLinuxและUnixมีโปรโตคอลหลัก ของ X Window System
ข้อได้เปรียบที่สำคัญที่สุดของ GDI เมื่อเทียบกับวิธีการเข้าถึงฮาร์ดแวร์โดยตรงอื่นๆ อาจอยู่ที่ความสามารถในการปรับขนาดและการแสดงผลแบบนามธรรมของอุปกรณ์เป้าหมาย การใช้ GDI ทำให้สามารถวาดภาพบนอุปกรณ์หลายเครื่อง เช่น หน้าจอและเครื่องพิมพ์ และคาดหวังได้ว่าจะแสดงผลได้อย่างถูกต้องในแต่ละกรณี ความสามารถนี้เป็นหัวใจสำคัญของแอปพลิเคชัน " สิ่งที่คุณเห็นคือสิ่งที่คุณได้รับ " ส่วนใหญ่สำหรับ Microsoft Windows
เกมง่ายๆ ที่ไม่ต้องการการเรนเดอร์กราฟิกที่รวดเร็วอาจใช้ GDI อย่างไรก็ตาม GDI ค่อนข้างใช้งานยากสำหรับการสร้างแอนิเมชั่นขั้นสูง ขาดความสามารถในการซิงโครไนซ์กับเฟรมวิดีโอ แต่ละเฟรม ในกราฟิกการ์ดและขาดการแรสเตอร์ไรเซชัน ด้วยฮาร์ดแวร์ สำหรับ 3 มิติ เกมสมัยใหม่ส่วนใหญ่จึงมักใช้Direct3D , VulkanหรือOpenGLแทน
รายละเอียดทางเทคนิค
ใน GDI นั้นบริบทอุปกรณ์ (DC) จะกำหนดคุณลักษณะของข้อความและรูปภาพสำหรับอุปกรณ์แสดงผล เช่น หน้าจอหรือเครื่องพิมพ์ GDI จะเก็บรักษาบริบทจริงเอาไว้ การสร้างเอาต์พุตต้องใช้ตัวจัดการบริบทอุปกรณ์ (HDC) หลังจากสร้างเอาต์พุตเสร็จแล้ว ก็สามารถปล่อยตัวจัดการนั้นได้
GDI ใช้ขั้นตอนวิธีวาดเส้นของ Bresenhamเพื่อวาดเส้นที่ซ้อนทับกัน[ 1 ]
ประวัติเวอร์ชัน
เวอร์ชันแรกๆ
GDI มีอยู่ใน Windows รุ่นแรก โปรแกรม MS-DOS ได้จัดการฮาร์ดแวร์กราฟิกโดยใช้การขัดจังหวะซอฟต์แวร์ (บางครั้งผ่านBIOS วิดีโอ ) และโดยการจัดการหน่วยความจำวิดีโอโดยตรง โค้ดที่เขียนในลักษณะนี้คาดหวังว่าจะเป็นผู้ใช้หน่วยความจำวิดีโอเพียงรายเดียว ซึ่งไม่สามารถทำได้ในสภาพแวดล้อมแบบมัลติทาสก์เช่น Windows นิตยสาร BYTEในเดือนธันวาคม พ.ศ. 2526 ได้กล่าวถึงแผนการของ Microsoft สำหรับระบบที่จะส่งออกกราฟิกไปยังทั้งเครื่องพิมพ์และจอภาพด้วยโค้ดเดียวกันใน Windows รุ่นแรกที่จะมาถึง[ 2 ]
บนWindows 3.1xและWindows 9x GDI สามารถใช้ คุณสมบัติ bit blitสำหรับการเร่งความเร็ว 2D ได้ หากมีการติดตั้งไดรเวอร์การ์ดกราฟิก ที่เหมาะสม [ 3 ]
ตั้งแต่Windows NT 4.0 เป็นต้น มา GDI ของWindows NTทำงานในโหมดเคอร์เนล [ 4 ] แต่ตั้งแต่Windows Vista เป็นต้น มา DWM ทำงานในโหมดผู้ใช้
วินโดวส์ เอ็กซ์พี
เมื่อมีการเปิดตัวWindows XP GDI +ก็เข้ามาเสริม GDI GDI+ เขียนด้วยภาษา C++ โดยเพิ่มคุณสมบัติกราฟิก 2 มิติแบบป้องกันรอยหยัก (anti-aliased), พิกัดแบบจุดลอยตัว (floating-point coordinates), การแรเงาแบบไล่ระดับสี (gradient shading), การจัดการเส้นทางที่ซับซ้อนมากขึ้น, การรองรับรูปแบบไฟล์กราฟิกสมัยใหม่ เช่นJPEGและPNG โดยตรง และการรองรับการรวมการแปลงแบบ แอฟ ฟิน (affine transformations)ในไปป์ไลน์การแสดงผล 2 มิติ GDI+ ใช้ ค่า RGBAในการแสดงสี คุณสมบัติเหล่านี้เห็นได้ชัดในส่วนประกอบของ Windows XP เช่นMicrosoft Paint , Windows Picture and Fax Viewer , Photo Printing Wizard และโปรแกรมรักษาหน้าจอ My Pictures Slideshow การมีอยู่ของ GDI+ ในเลเยอร์กราฟิกพื้นฐานช่วยลดความซับซ้อนในการใช้งานระบบกราฟิกแบบเวกเตอร์ เช่นAdobe FlashหรือSVG อย่างมาก นอกจากนี้ . NET Frameworkยังมีอินเทอร์เฟซแบบจัดการสำหรับ GDI+ ผ่านทางSystem.Drawingเนมสเปซอีก ด้วย
แม้ว่า GDI+ จะรวมอยู่ใน Windows XP และเวอร์ชันที่ใหม่กว่า แต่ไลบรารีไดนามิก GDI+ ก็สามารถจัดส่งมาพร้อมกับแอปพลิเคชันและใช้งานบน Windows เวอร์ชันเก่ากว่าได้เช่นกัน[ 5 ]
เนื่องจากความสามารถในการประมวลผลข้อความเพิ่มเติมและความเป็นอิสระของความละเอียดใน GDI+ CPU จึงทำการเรนเดอร์ข้อความ[ 6 ]ผลลัพธ์ที่ได้คือช้ากว่าGDI ที่เร่งความเร็วด้วยฮาร์ดแวร์ หลายเท่า [ 7 ] คริส แจ็กสันได้เผยแพร่การทดสอบบางส่วนที่ระบุว่าโค้ดการเรนเดอร์ข้อความที่เขาเขียนสามารถเรนเดอร์ได้ 99,000 ตัวอักษรต่อวินาทีใน GDI แต่โค้ดเดียวกันนี้เมื่อใช้ GDI+ จะเรนเดอร์ได้เพียง 16,600 ตัวอักษรต่อวินาที
GDI+ มีความคล้ายคลึงกัน (ทั้งในด้านวัตถุประสงค์และโครงสร้าง) กับ ระบบย่อย QuickDraw GXของAppleและไลบรารีโอเพนซอร์ส อย่างlibartและcairo
วินโดววิสต้า
ใน Windows Vista แอปพลิเคชัน Windows ทั้งหมด รวมถึงแอปพลิเคชัน GDI และ GDI+ ทำงานในเอ็นจิ้นการจัดองค์ประกอบใหม่Desktop Window Manager (DWM) ซึ่งเร่งความเร็วด้วยฮาร์ดแวร์ GPU ดังนั้น GDI เองจึงไม่ได้รับการเร่งความเร็วด้วยฮาร์ดแวร์อีกต่อไป[ 8 ] [ 9 ] [ 10 ]เนื่องจากลักษณะของการดำเนินการจัดองค์ประกอบ การย้ายหน้าต่างจึงเร็วขึ้นหรือตอบสนองได้ดีขึ้น เนื่องจากแอปพลิเคชันไม่จำเป็นต้องเรนเดอร์เนื้อหาพื้นฐานใหม่[ 9 ]
วินโดวส์ 7
Windows 7มีการเร่งความเร็วฮาร์ดแวร์ GDI สำหรับ การดำเนินการ blittingในWindows Display Driver Model v1.1ซึ่งช่วยปรับปรุงประสิทธิภาพของ GDI และอนุญาตให้ DWM ใช้หน่วยความจำวิดีโอภายในเครื่องสำหรับการจัดองค์ประกอบภาพ ทำให้ลดการใช้หน่วยความจำ ของระบบ และเพิ่มประสิทธิภาพการทำงานของกราฟิก การดำเนินการ GDI ขั้น พื้นฐาน ส่วนใหญ่ ยังคงไม่ได้รับการเร่งความเร็วด้วยฮาร์ดแวร์ ต่างจากDirect2D GDI+ ยังคงอาศัยการเรนเดอร์ด้วยซอฟต์แวร์ใน Windows 7 [ 11 ]
เครื่องพิมพ์ GDI
เครื่องพิมพ์ GDI หรือWinprinter (คล้ายกับWinmodem ) คือเครื่องพิมพ์ที่ออกแบบมาเพื่อรับเอาต์พุตจากคอมพิวเตอร์โฮสต์ที่ใช้ Windows ซึ่งทำหน้าที่ประมวลผลการพิมพ์ทั้งหมด: GDI จะแสดงผลหน้าเป็นบิตแมป ซึ่งไดรเวอร์เครื่องพิมพ์ ของคอมพิวเตอร์ จะรับ ประมวลผล และส่งไปยังเครื่องพิมพ์ที่เกี่ยวข้อง[ 12 ] [ 13 ]การสื่อสารระหว่าง GDI และไดรเวอร์ของคอมพิวเตอร์กับเครื่องพิมพ์เป็นแบบสองทิศทาง เครื่องพิมพ์จะบอกคอมพิวเตอร์ว่าพร้อมที่จะพิมพ์หรือออฟไลน์ กระดาษหมด และอื่นๆ
เครื่องพิมพ์ที่มีภาษาควบคุม ของตัวเอง สามารถรับอินพุตจากอุปกรณ์ใดๆ ก็ได้ที่มีไดรเวอร์ที่เหมาะสม โดยไม่จำเป็นต้องใช้พีซีที่ใช้ Windows เครื่องพิมพ์ดังกล่าวต้องการฮาร์ดแวร์ เฟิร์มแวร์ และหน่วยความจำสำหรับการแสดงผลหน้าเว็บ ซึ่งโดยปกติแล้ว GDI ของคอมพิวเตอร์โฮสต์ Windows จะเป็นผู้ดำเนินการ เครื่องพิมพ์ GDI สามารถใช้งานได้กับคอมพิวเตอร์ในเครือข่าย หากเชื่อมต่อเป็นเครื่องพิมพ์ที่ใช้ร่วมกันบนคอมพิวเตอร์ที่ใช้ Windows ไดรเวอร์ GDI "ทั่วไป" บางตัวpnm2ppaได้รับการเขียนขึ้น โดยมีจุดประสงค์เพื่อให้เครื่องพิมพ์ GDI เข้ากันได้กับระบบปฏิบัติการที่ไม่ใช่ Windows เช่นFreeBSDแต่ไม่สามารถรองรับเครื่องพิมพ์ทั้งหมดได้[ 12 ]
เพื่อให้การสร้างไดรเวอร์สำหรับเครื่องพิมพ์ Winprinter ทำได้ง่ายขึ้น ไมโครซอฟต์ได้พัฒนาUniversal Printer Driverขึ้นมา ซึ่งช่วยให้ผู้ผลิตเครื่องพิมพ์สามารถเขียน "มินิไดรเวอร์" Generic Printer Description (GPD) ที่อธิบายความสามารถและชุดคำสั่งของเครื่องพิมพ์ในรูปแบบข้อความธรรมดา โดยไม่จำเป็นต้องเขียนโปรแกรมในโหมดเคอร์เนล
ไมโครซอฟต์ได้เปลี่ยนจากการใช้โมเดลการพิมพ์ GDI มาใช้Open XML Paper Specificationแล้ว
ข้อจำกัด
หน้าต่างแต่ละบานใช้ GDI object เมื่อความซับซ้อนของหน้าต่างเพิ่มขึ้น พร้อมด้วยคุณสมบัติเพิ่มเติม เช่น ปุ่มและรูปภาพ การใช้งาน GDI object ก็จะเพิ่มขึ้นเช่นกัน เมื่อมีการใช้งาน object มากเกินไป Windows จะไม่สามารถวาด GDI object เพิ่มเติมได้ ทำให้ซอฟต์แวร์ทำงานผิดปกติ และโปรแกรมหยุดทำงานและไม่ตอบสนอง[ 14 ]แอปพลิเคชันจำนวนมากยังเขียนโค้ดไม่ถูกต้องและไม่ปล่อย GDI object หลังจากใช้งาน ซึ่งยิ่งทำให้ปัญหารุนแรงขึ้น[ 15 ]จำนวน GDI object ทั้งหมดที่มีอยู่จะแตกต่างกันไปในแต่ละเวอร์ชันของ Windows: Windows 9xมีขีดจำกัดที่ 1,200 object; Windows 2000 มีขีดจำกัดที่ 16,384 object; และ Windows XP และเวอร์ชันที่ใหม่กว่ามีขีดจำกัดที่กำหนดค่าได้ (ผ่านรีจิสทรี) ซึ่งค่าเริ่มต้นคือ 10,000 object ต่อกระบวนการ (แต่สูงสุดตามทฤษฎีคือ 65,536 สำหรับเซสชันทั้งหมด) [ 16 ] [ 17 ] Windows 8 และเวอร์ชันที่ใหม่กว่าจะเพิ่มขีดจำกัดวัตถุ GDI เป็น 65,536 ต่อเซสชันการเข้าสู่ระบบของผู้ใช้
ระบบปฏิบัติการ Windows รุ่นก่อนๆ เช่น Windows 3.1 และ Windows 98 มีโปรแกรมวัดทรัพยากร (Resource Meter) เพื่อให้ผู้ใช้สามารถตรวจสอบปริมาณการใช้งานทรัพยากร GDI ของระบบทั้งหมดได้ โปรแกรมวัดทรัพยากรนี้ก็ใช้ทรัพยากร GDI ด้วยเช่นกัน ส่วนระบบปฏิบัติการรุ่นหลังๆ เช่น Windows 2000 และ Windows XP สามารถรายงานการใช้งานทรัพยากร GDI ของแต่ละโปรแกรมใน Task Manager ได้ แต่ไม่สามารถบอกผู้ใช้ได้ว่ามีทรัพยากร GDI ทั้งหมดเท่าใด
การที่ GDI มีความจุเกินอาจส่งผลกระทบต่อ Windows เอง ทำให้ไม่สามารถเปิดหน้าต่างใหม่ แสดงเมนู และกล่องข้อความแจ้งเตือนได้ สถานการณ์นี้แก้ไขได้ยากและอาจต้องรีเซ็ตระบบแบบบังคับ เนื่องจากจะทำให้โปรแกรมหลักของระบบทำงานไม่ได้ ใน Windows 8 และ 8.1 การล็อกออฟแบบบังคับจะเกิดขึ้นเมื่อ GDI มีความจุเกิน แทนที่จะเป็นการรีบูตเครื่อง
ผู้สืบทอด
Direct2Dเป็นผู้สืบทอดของ GDI และ GDI+ DirectWrite ซึ่งเป็นพี่น้องของ Direct2D นั้น เข้ามาแทนที่Uniscribeโดยถูกจัดส่งมาพร้อมกับ Windows 7 และ Windows Server 2008 R2 และมีให้ใช้งานสำหรับ Windows Vista และ Windows Server 2008 (เมื่อติดตั้ง Platform Update แล้ว) ต่อมา Microsoft ได้พัฒนาWin2Dซึ่งเป็น ไลบรารีคลาสแบบ GDI ที่เป็น โอเพนซอร์สและใช้งานได้ฟรีกลุ่มเป้าหมายของ Win2D คือนักพัฒนาที่ใช้ C++, C# และ Visual Basic.NET ในการพัฒนาแอปพลิเคชัน Universal Windows Platform [ 18 ]
ดูเพิ่มเติม
หมายเหตุและเอกสารอ้างอิง
- ^ Steven, White; David, Coulter; Mike, Jacobs (31 พฤษภาคม 2018). "การเปรียบเทียบการเร่งความเร็วฮาร์ดแวร์ Direct2D และ GDI" . Windows Developer . Microsoft .
- ^บัตเลอร์, จอห์น (ธันวาคม 1983). "การแสดงผลกราฟิกที่ไม่ขึ้นกับอุปกรณ์สำหรับ Microsoft Windows" . BYTE . หน้า 49 . สืบค้นเมื่อ20 ตุลาคม 2013 .
- ^ "คู่มือการใช้งานและแก้ไขข้อผิดพลาด CL-GD543X - ฉบับแก้ไข 1.2" (PDF) . Cirrus Logic . เมษายน 1994 . สืบค้นเมื่อ4 มกราคม 2025 .
- ^ "การโจมตีเคอร์เนลผ่านการเรียกกลับในโหมดผู้ใช้" (PDF) . เก็บถาวรจากต้นฉบับ(PDF)เมื่อวันที่ 19 มกราคม 2012
- ^ชุดพัฒนาซอฟต์แวร์สำหรับแพลตฟอร์ม (SSDK) ที่สามารถแจกจ่ายได้: GDI+
- ^ "API การวาดภาพ 2 มิติใน Windows -" . บล็อกนักพัฒนา DirectX . บล็อก MSDN. 12 พฤษภาคม 2552 . สืบค้นเมื่อ19 กรกฎาคม 2555 .
- ^แจ็กสัน, คริส. "ประสิทธิภาพการแสดงผลข้อความ GDI เทียบกับ GDI+" . Chris Jackson's Semantic Consonance . ไมโครซอฟต์.
- ^ MSDN: การเปรียบเทียบการเร่งความเร็วฮาร์ดแวร์ Direct2D และ GDI
- ^ a b GDI ไม่ได้รับการเร่งความเร็วด้วยฮาร์ดแวร์ใน Windows Vista
- ^หน้าต่างแบบเลเยอร์...ซอฟต์แวร์บางครั้งเร็วกว่าฮาร์ดแวร์ Avalite บน MSDN Blogs
- ^โทมัส โอลเซ่น (29 ตุลาคม 2551). "แนะนำ Microsoft Direct2D API "
- ^ a b "เครื่องพิมพ์ GDI ทั่วไป" . การพิมพ์แบบเปิด . มูลนิธิลินุกซ์. สืบค้นเมื่อ21 กรกฎาคม 2021 .
- ^ "เครื่องพิมพ์ที่ใช้ได้เฉพาะกับ Windows" . โครงการเอกสาร Linux . สืบค้นเมื่อ29 ตุลาคม 2019 .
- ^บทความฐานความรู้ของ Microsoft หมายเลข 838283 - เมนูแอปพลิเคชันบนเดสก์ท็อปแสดงผลไม่ถูกต้องหากกระบวนการเกินโควต้าวัตถุ GDI ใน Windows XP หรือ Windows 2000 http://support.microsoft.com/kb/838283
- ^บล็อกเครือข่ายนักพัฒนาของ Microsoft - การรั่วไหลของ GDI ใน Outlook 2007 ทำให้เกิดปัญหาเมื่อการใช้งาน GDI ถึง 10,000 อ็อบเจ็กต์ https://blogs.msdn.com/rgregg/archive/2007/09/03/outlook-2007-gdi-leak-hotfix.aspx
- ^เครือข่ายนักพัฒนาของ Microsoft - ข้อจำกัดของอ็อบเจ็กต์ GDI https://msdn.microsoft.com/en-us/library/ms724291(VS.85).aspx
- ^บทความฐานความรู้ของ Microsoft หมายเลข 894500 - โปรแกรม .NET ที่ออกแบบบนระบบปฏิบัติการ NT รุ่นใหม่กว่า อาจทำงานผิดพลาดบน Windows 95 / Windows 98 / Windows ME รุ่นเก่ากว่า เนื่องจากข้อจำกัดการใช้งาน GDI ที่ต่ำกว่า http://support.microsoft.com/kb/894500
- ^ "Win2D" . microsoft/Win2D repo . Microsoft . สืบค้นเมื่อ21 กรกฎาคม 2021 – ผ่านGitHub.com .
ลิงก์ภายนอก
- หน้า GDI+ ของ Microsoft
- รายการคำถามที่พบบ่อย (FAQ) เกี่ยวกับ GDI+ ของ Bob PowellในWayback Machine (เก็บถาวรเมื่อ 2015-04-20)
- บทความ MSDN เกี่ยวกับภาพรวมของ GDI
- ประกาศด้านความปลอดภัยของ Microsoft MS04-028
- ช่องโหว่ร้ายแรงในระบบปฏิบัติการ MS Windows อาจทำให้ภัยคุกคามจากไวรัสทวีความรุนแรงขึ้น - F-SecureจากWayback Machine (เก็บถาวรเมื่อ 4 กุมภาพันธ์ 2009)
- IGDI+ - ไลบรารีDelphiโอเพ่นซอร์สสำหรับ GDI+
สรุปเนื้อหา
ข้อมูลสำคัญจากบทความ
ข้อมูลสำคัญเกี่ยวกับ อินเทอร์เฟซอุปกรณ์กราฟิก
อินเทอร์เฟซอุปกรณ์กราฟิก ( GDI ) เป็นส่วนประกอบดั้งเดิมของMicrosoft Windowsที่ทำหน้าที่แสดงผลวัตถุกราฟิกและส่งข้อมูลไปยังอุปกรณ์แสดงผลเช่นจอภาพและเครื่องพิมพ์ ต่อมา...
รายละเอียดทางเทคนิค
ใน GDI นั้น บริบทอุปกรณ์ (DC) จะกำหนดคุณลักษณะของข้อความและรูปภาพสำหรับอุปกรณ์แสดงผล เช่น หน้าจอหรือเครื่องพิมพ์ GDI จะเก็บรักษาบริบทจริงเอาไว้ การสร้างเอาต์พุตต้อง ใช้ตัวจัดการบริบทอุปกรณ์ (HDC) หลังจากสร้างเอาต์พุตเสร็จแล้ว ก็สามารถปล่อยตัวจัดการนั้นได้
เวอร์ชันแรกๆ
GDI มีอยู่ใน Windows รุ่นแรก โปรแกรม MS-DOS ได้จัดการฮาร์ดแวร์กราฟิกโดยใช้ การขัดจังหวะซอฟต์แวร์ (บางครั้งผ่าน BIOS วิดีโอ ) และโดยการจัดการ หน่วยความจำวิดีโอ โดยตรง โค้ดที่เขียนในลักษณะนี้คาดหวังว่าจะเป็นผู้ใช้หน่วยความจำวิดีโอเพียงรายเดียว...
วินโดวส์ เอ็กซ์พี
เมื่อมีการเปิดตัว Windows XP GDI + ก็เข้ามาเสริม GDI GDI+ เขียนด้วยภาษา C++ โดยเพิ่มคุณสมบัติกราฟิก 2 มิติแบบป้องกันรอยหยัก (anti-aliased), พิกัดแบบจุดลอยตัว (floating-point coordinates), การแรเงาแบบไล่ระดับสี (gradient shading),...