GDI+

来自维基百科,自由的百科全书

圖形裝置介面(英語:Graphics Device Interface[1],縮寫 GDI)是微軟 Windows 作業系統提供的應用程式介面,也是其用來表示圖形對象、將圖形對象傳送給諸如監視器印表機之類輸出裝置的核心組件。GDI 是 Windows 作業系統的三大核心部件(也稱「子系統」)之一[來源請求]GDI+ 在 GDI 的基礎上調整了編程模型,同時加入了漸變色畫刷、Alpha混合等功能。[2]

GDI用來完成一些和繪製有關的工作,像直線或曲線的繪製,文字彩現,調色盤控制。它不能用來直接繪製一些介面元素,像視窗、清單等等,這些工作由使用者子系統來完成,位於user32.dll中,它是建立在GDI之上的一個軟體層。其他系統也有類似GDI的東西,比如Macintosh的Quartz(傳統的QuickDraw),和GTK的GDK/Xlib。

GDI最大的好處是它有可以直接訪問硬體裝置的能力。通過GDI可以非常容易的在不同類型的裝置上繪製圖形,像顯示器和印表機或類似的顯示裝置。這些能力是微軟Windows系統「所見即所得」程式的核心。

簡單的不需要快速圖形彩現的遊戲可能會用到GDI。但是GDI對一些進階的動畫製作無能為力,它缺少顯示卡中訊框的概念,還缺少3D圖形硬體光柵化的支援等等。現代的遊戲通常使用DirectX和OpenGL而不是GDI,因為這些技術能更好的讓程式設計師利用硬體的特性來加速圖形圖像的顯示。

簡介

DOS時期,應用程式如果要輸出畫面到顯示裝置,必須使用INT 10[3],或對顯示卡直接進行I/O,或直接在視訊記憶體(VRAM)相應的位置填值。但顯示卡當時日新月異,各廠商的顯示卡對其I/O埠的定義並不一致,雖然中途有推出過一個名為VESA SVGA的顯示卡驅動程式通用標準,但由於DOS時期先天的64KB分頁限制,仍有許多不便。

微軟在開發Windows時發現了這一問題,於是決定打造一個GDI子系統,將顯示裝置改為通過API進行操作,以便讓顯示卡廠商自行開發驅動程式對接GDI,來打消各顯示卡在操作標準上的彼此差異。

但微軟很快就被其他的程式開發者告知,GDI太慢了,因此又推出了WING[4]用於Windows 3.0/3.1,讓應用程式能夠直接對VRAM填值,以加速繪圖的相關計算。

後來,WING改為DirectDraw,成為DirectX的一部分,直到DirectX 7。(DirectX 8以後,DirectX中2D與3D顯示技術合併,進入全3D的貼圖計算方式)

微軟在推廣.Net Framework時,又將GDI用.Net Framework的方式進行封裝,可是由於GDI本身的限制,加上微軟自己在MSDN Library的檔案實用性有所欠缺(有些功能已有技術檔案,但從未做出實際可用的功能),再加上GDI+在圖形計算與顯示方面不算快,以及先後飽受遠端程式碼執行漏洞等問題之下,使其無法成為微軟在圖形子系統的主流。

到DirectX 10時,已經進入以DirectX的COM為基礎,以.Net Framework方式進行封裝的XNA時代。XNA身兼DirectX的效能與.Net Framework的便利性,已套用於XBOX系列遊戲主機,現已成為新一代圖形子系統的主流。

GDI+

GDI+從Windows XP作業系統開始引入,提供二維的向量圖形,改進舊有的GDI,加強的視覺化屬性,例如邊界,漸變和透明。通過GDI+,能夠直接將BMP轉成JPG或其它格式的圖片,還能夠生成SVGFlash等。GDI+ 使用ARGB的值來表示顏色。GDI+的雙緩衝技術可以提高繪圖效率,可避免螢幕閃爍。

GDI+號稱提供了硬體加速功能,可以直接訪問硬體。但這似乎是誇飾的說法,GDI+無法直接使用VGA卡上的GPU來加速繪圖的相關計算,因此在繪圖效能上遠遠不及DirectX,只能做到Lock記憶體進行操作。(GDI+只是一組重新封裝GDI的API,DirectX則是從COM到底層的顯示卡驅動程式的組合)

隨GDI+推出了加強型EMF,即EMF+,可以同時支援GDI和GDI+。Microsoft .NET透過System.Drawing命名空間提供對GDI+的支援。The GDI+ 的DLL可移植到舊有的Windows版本上。

GDI+ 類似Apple的Quartz 2D子系統,以及屬於開放原始碼(open-source)的libartCairo媒體櫃。

參考文獻

外部連結

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.