Graphics Device Interface
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2023/08/19 19:38 UTC 版)
GDIはグラフィカルオブジェクトの表示と、ディスプレイやプリンターのような出力機器への転送のためのWindows規格である。
GDI
GDIは直線や曲線の描画、矩形や楕円の描画と塗りつぶし、ビットマップ画像(ラスター画像)の操作、フォントの管理とレンダリング、パレットの制御[2]といった処理を担当する(gdi32.dll)。ウィンドウやメニューなどのような上位レベルの描画については直接関わらず、より上位の user32.dll にあるユーザーサブシステムに任される。
GDIはハードウェアに直接アクセスするデバイスドライバーよりも上位に位置し、デバイスの機能的な調整と抽象化がGDIの役目である。GDIを使うことにより、画面やプリンターなどの多様なデバイスに容易に描画でき、そして各デバイスで適切な表示結果を望める。この機能はWindowsの全てのWYSIWYGアプリケーションの要である。
フリーセルやマインスイーパ(Windows XP以前)のような高速な描画が不要なゲームはGDIを使用していた。しかし、GDIはアニメーションをうまく表示できず(フレームバッファ同期の概念が無い)[注釈 1]、3D ラスタライズ機能がないこともあり、ゲーム開発には不向きである。そのため、ゲーム開発では一般的に2D/3D問わず、ハードウェアの機能や性能をより活用できるDirectX (Direct2D/Direct3D) やOpenGL、Vulkanが使われる。
Windows Vista では、GDI アプリケーションは新しい描画エンジンである Desktop Window Manager (DWM) のもとで動作し、GDIコンテンツはいったんシステムメモリ上のビットマップにCPUで描画され、ハードウェアアクセラレーションは用いられない。Windows 7 以降では GDI の一部[8]が再びハードウェアアクセラレートされるようになっているが、DWM が有効になっている必要がある[9]。
GDI プリンター
GDI プリンター(Winmodem のように Winprinters としても知られている)、特に GDI レーザープリンターは本来プリンターが行う処理の一部をホストコンピュータ (PC) 側で代行する。ホストコンピュータでビットマップイメージを描写し、プリンターにビットマップを転送する。この方式には以下の2つの利点がある。
また、以下の点で不利である。
- ホストコンピュータの負荷が高くなる。最近のPCでは問題ないが、古いPCで複雑なドキュメントを印刷する場合は非常に遅くなる場合がある。
- GDI プリンターは通常、プリンターのファームウェアに標準的な印刷機能のエミュレーションを含まない(またはそれを処理できる能力を持たない)。ハイエンドの PCL プリンターや PostScriptプリンターでは、ソフトウェアの互換性やドライバーのバグなどの問題があった場合にドライバーを更新して対応できるが、GDI プリンターでは対応策がない場合がある。
- GDIプリンターは一般的に Windows に限り動作する。例外はあるが、他の OS では原則的に GDI プリンターを使用できない。
最新のインクジェットプリンターの機種は GDI ベース(レーザプリンターでは費用が主要因であるのに対し、ここでは主に性能の理由)であるが、より柔軟な傾向がある。多くが Mac に対応し、Linux コミュニティでは Linux 版ドライバーの対応をかなり改善した。一部(特にセイコーエプソン)ではより伝統的なエミュレーションを予備として提供することが多い。
一般的には安価なレーザプリンターは GDI デバイスであるが、多くのメーカーでは PCL や PostScript あるいはその両方の機能を持つモデルも製造している。GDI のみに対応するプリンターはどのメーカーにおいても最も安価なモデルとして位置づけられる。
詳細
デバイスコンテキスト
デバイスコンテキスト (device context) は、描画する対象を抽象化した存在である。画面またはプリンターへ出力するテキストおよびイメージの属性を定義するために使われ、関連付けられたグラフィックスオブジェクトとそれに関連する属性の集合からなる。実際のコンテキストはGDIによって管理される。構造体へのハンドルであるデバイスコンテキストは出力を行う前に取得し、要素が書き込まれた後に解放する。大抵のGDIオブジェクトのように、デバイスコンテキストは直接データにアクセスできないという意味で隠蔽されているが、それを制御し、何かを描画し、情報を取得し、オブジェクトを変更するといったような様々な GDI 関数にデバイスコンテキストを渡すことができる。
デバイスコンテキストには次の種類がある。
- 画面
- プリンター
- メモリ
- 情報(インフォメーションコンテキスト)
このうち、情報は描画に用いることはできない情報取得専用のデバイスコンテキストである。
グラフィックスオブジェクト
デバイスコンテキストに関連付けが可能なグラフィクスオブジェクトには次の種類がある。これらは、SelectObject
関数[10]やSelectPalette
関数[11]によってデバイスコンテキストに関連付けさせることが可能である。
- ビットマップ (HBITMAP)
- ブラシ (HBRUSH)
- フォント (HFONT)
- ペン (HPEN)
- リージョン (HRGN)
- パス (リージョンに変換可能)
- パレット (HPALETTE)
なおGDIオブジェクトの数は、1セッションで65,535個まで、そして1プロセスで10,000個までという上限が設けられている[12]。
注釈
- ^ Direct3DやDirect2DのようなグラフィックスAPIは、ディスプレイのリフレッシュレートに合わせてフロントバッファ(表画面)とバックバッファ(裏画面)を入れ替える垂直同期の機能が用意されているため、テアリング現象を防ぐことができ、また1/60秒などの一定間隔で更新されるアニメーションを容易に実現できる[3][4]。GDIでアニメーションを実現する方法のひとつとして、タイマーを使う方法が挙げられるが、Windowsの
WM_TIMER
によるタイマーはメッセージ優先度が低い[5]こともあって分解能も精度も悪く、API仕様上もUSER_TIMER_MINIMUM
すなわち10ミリ秒未満のタイマー間隔を指定できない[6]。ただしWindows 7以降は、Direct3D/Direct2DだけでなくGDI/GDI+と組み合わせて使うこともできるWindows Animation Managerが追加されている[7]。
出典
- ^ Overview of the Windows Graphics Architecture - Win32 apps | Microsoft Learn
- ^ GDI Support for Palettes - Windows drivers | Microsoft Learn
- ^ What Is a Swap Chain? (Direct3D 9) - Win32 apps | Microsoft Learn
- ^ §Presentation Model : Comparing Direct2D and GDI Hardware Acceleration - Win32 apps | Microsoft Learn
- ^ WM_TIMER message (Winuser.h) - Win32 apps | Microsoft Learn
- ^ SetTimer function (winuser.h) - Win32 apps | Microsoft Learn
- ^ Windows Animation Manager - Win32 apps | Microsoft Learn
- ^ §GDI rendering in Windows 7 : Comparing Direct2D and GDI Hardware Acceleration - Win32 apps | Microsoft Learn
- ^ §Availability of Hardware Acceleration : Comparing Direct2D and GDI Hardware Acceleration - Win32 apps | Microsoft Learn
- ^ SelectObject function (wingdi.h) | Microsoft Docs
- ^ SelectPalette function (wingdi.h) | Microsoft Docs
- ^ Windows の限界に挑む: USER オブジェクトと GDI オブジェクト – 第 2 部
- ^ “GDI+” (英語). MSDN ライブラリ. マイクロソフト. 2008年9月13日時点のオリジナルよりアーカイブ。2009年2月22日閲覧。
- ^ “Platform SDK Redistributable: GDI+” (英語). ダウンロードセンター. マイクロソフト. 2009年2月22日閲覧。[リンク切れ]
- ^ “Download Platform SDK Redistributable: GDI+ from Official Microsoft Download Center”. Microsoft (2009年10月13日). 2015年1月25日閲覧。[リンク切れ]
- ^ System.Drawing Namespace | Microsoft Docs
- ^ About GDI+ Managed Code | Microsoft Docs
- ^ §GDI and Direct2D hardware acceleration : Comparing Direct2D and GDI Hardware Acceleration - Win32 apps | Microsoft Learn
- ^ What's new in Direct2D - Win32 apps | Microsoft Learn
- ^ Printing and command lists - Win32 apps | Microsoft Learn
- 1 Graphics Device Interfaceとは
- 2 Graphics Device Interfaceの概要
- 3 GDI+
- 4 Direct2D
- 5 脚注
固有名詞の分類
オペレーティングシステムの仕組み |
Windows Driver Model 軽量カーネルスレッド Graphics Device Interface データ実行防止 ブートセクタ |
マイクロソフトのAPI |
ActiveX Data Objects Trident Graphics Device Interface Microsoft XNA Windows API |
グラフィックライブラリ |
Graphics Device Interface Libpng Java 3D GLSL Open Inventor |
- Graphics Device Interfaceのページへのリンク