GDI(グラフィックスデバイスインタフェース)とは — Windows描画APIの概要と用途

GDI(グラフィックスデバイスインタフェース)の概要と用途を分かりやすく解説。Windows描画APIの仕組み、デバイス抽象化、利点と制限、DirectX/OpenGLとの違いまで網羅。

著者: Leandro Alegsa

グラフィックスデバイスインタフェースは、グラフィカルオブジェクトを表現し、プリンタやモニタなどの出力デバイスに転送するために使用されるMicrosoft WindowsのAPIです。GDI は、アプリケーションが画面や印刷物に対して描画命令を発行するときに、ハードウェア固有の差異を吸収して一貫した描画結果を提供する役割を担います。

概要と役割

GDI は主に 2D の描画を担当します。線や曲線、長方形や円のような図形描画、フォントのレンダリング、ビットマップ操作、パレット管理、クリッピング、座標変換(論理座標→デバイス座標)などを行います。ウィンドウやメニューなどのコントロール表示で使われる低レベルの描画基盤として、従来の Windows アプリケーションで広く利用されてきました。

基本概念と主な API

GDI を理解するうえで重要な概念には次のものがあります。

  • デバイスコンテキスト(DC):描画先(ウィンドウ、メモリ、プリンタなど)を表すハンドル。描画属性(ペン、ブラシ、フォントなど)は DC に関連付けて操作します。
  • GDI オブジェクト:ペン(線の色・太さ)、ブラシ(塗りつぶし)、フォント、ビットマップ、リージョン、パレットなど。Create系関数で生成し、SelectObject で DC に選択して使用します。
  • 描画関数:BitBlt、StretchBlt、MoveToEx/LineTo、Rectangle、Ellipse、TextOut、DrawText、ExtTextOut など。ビットブロック転送やテキスト描画、幾何学図形の描画に使います。
  • 座標系とマッピングモード:MM_TEXT や MM_ISOTROPIC など、論理座標系→デバイス座標系の変換を制御できます。これによりデバイスの解像度差や印刷時のスケーリングを吸収します。
  • メタファイル:WMF/EMF(Windows Metafile / Enhanced Metafile)は GDI の描画命令を記録・再生できる形式で、印刷や描画コマンドの保存・再現に便利です。

よく使われる場面・用途

  • 標準的なデスクトップ GUI(ウィンドウのクライアント領域の描画、カスタムコントロール)
  • 印刷(プリンタの解像度に合わせたスケーリングや EMF を使った印刷パイプライン)
  • スクリーンキャプチャやビットマップ操作(BitBlt を用いた画像コピー・合成)
  • 簡単な 2D グラフやチャート、ビジネスアプリケーションの描画
  • .NET 環境では System.Drawing(内部的に GDI+/GDI を利用)による描画

長所

  • デバイス抽象化:スクリーンやプリンタなど複数デバイス間で同じ描画コードが使える。
  • 成熟した API:長年の互換性が保たれており、Windows のほとんどのバージョンで動作する。
  • プリンタ対応:高解像度のプリンティングを意識した API やメタファイルが整備されている。

短所・制約

  • GPU の機能をフルに利用する設計ではないため、3D レンダリングやハードウェアアクセラレーションが必須のアニメーションやゲームには不向きです。現代のゲームや高性能グラフィックスは通常、DirectXやOpenGLを使います。
  • ダブルバッファリングやフレームバッファ同期の概念が低レベルにないため、滑らかな高速アニメーションや垂直同期を扱いにくい場合があります。
  • GDI オブジェクト(ペンやブラシ等)は有限で、リークするとリソース不足に陥る。CreateObject したら必ず DeleteObject する必要があります。
  • スレッド周りの注意:DC やウィンドウに対する描画は通常 UI スレッド(WM_PAINT 処理内)で行うのが安全です。背景での直接描画は競合や更新漏れを招くことがあります。

GDI とその後継・周辺技術

GDI の上位互換や代替としては以下があります。

  • GDI+:GDI を拡張した API。よりリッチな 2D 機能(アルファ合成、グラデーション、拡張テキスト処理)を提供し、.NET の System.Drawing などで使われます。ただし GDI+ も最新 GPU を直接制御するものではありません。
  • Direct2D / DirectWrite:ハードウェアアクセラレーションを活用した 2D 描画と高品質なテキスト描画を提供するモダンな API。高パフォーマンス・高品質を必要とするアプリで推奨されます。
  • WPF(Windows Presentation Foundation):ベクトルベースでリッチな UI を構築でき、必要に応じて DirectX を利用します。ハードウェアアクセラレーションに適しています。
  • OpenGL / DirectX:主に 3D レンダリング向けですが、2D でも高性能描画に利用されます。ゲームや多数の動的オブジェクトを扱うアプリで一般的です。

実践上の注意点

  • WM_PAINT ハンドラ内では BeginPaint/EndPaint を使い、必要な領域のみ更新する。
  • バックバッファ(メモリ DC)を用いたダブルバッファリングでチラツキを抑える。BitBlt/StretchBlt が有用。
  • GDI オブジェクトは使用後に適切に解放する(SelectObject 後は元のオブジェクトに戻して DeleteObject)。GDI ハンドルのリークはパフォーマンス低下や描画破綻につながる。
  • 高解像度ディスプレイ(DPI)の対応:論理座標と物理ピクセルの違いを理解し、GetDeviceCaps やマッピングモードを利用して DPI に依存しない描画を行う。
  • 複雑で高性能が求められる描画は、Direct2D や Direct3D、WPF などへの移行を検討する。

まとめると、GDI は Windows の伝統的な 2D 描画基盤であり、プリンタやスクリーン向けのデバイス抽象化や基本的な図形/テキスト描画に強みがあります。一方で、現代のハードウェアを活用した高性能・高品質な描画が必要な場面では、DirectXやOpenGLをはじめとするより新しい技術や、Direct2D/WPF のようなモダンなレンダリング技術を選択することが一般的です。また、GDI を扱う際はリソース管理(GDI オブジェクトの解放)やスレッド/描画タイミングの管理に注意してください。

質問と回答

Q: GDI(Graphics Device Interface)とは何ですか?


A: Graphics Device Interface (GDI) は Microsoft Windows の API で、グラフィックオブジェクトを表現し、プリンタやモニタなどの出力デバイスに送信するために使用されます。

Q: GDIはどのようなタスクを担当しますか?


A: GDIは、線や曲線の描画、フォントのレンダリング、パレットの処理などのタスクを担当します。

Q: GDIはどのようなタスクを担当しないのですか?


A: GDIは、ウィンドウやメニューなどの描画を直接担当しません。そのタスクは、GDIの上に構築された別のサブシステムに予約されています。

Q: GDIに似たコンポーネントを持つ他のシステムには何がありますか?


A: GDIに似たコンポーネントを持つ他のシステムには、MacintoshのQuickDrawとGNOME/GTKのGDK/Xlibがあります。

Q: ハードウェアに直接アクセスする方法と比較して、GDIの最も重要な機能は何ですか?


A: GDIがハードウェアに直接アクセスする方法と比較して最も重要な能力は、そのスケーリング能力とターゲットデバイスの抽象化です。

Q: Microsoft WindowsのWhat You See Is What You Getアプリケーションの中心は何ですか?


A: スクリーンやプリンターなど複数のデバイスに描画し、それぞれのケースで適切な再現を期待する機能は、Microsoft WindowsのすべてのWhat You See Is What You Getアプリケーションの中心にあります。

Q:最近のゲームにおけるGDIの主な欠点は何ですか?


A: 最近のゲームにおけるGDIの主な欠点は、フレームバッファと同期する概念がなく、3D用のラスタライズがないため、適切なアニメーションを行うことができないということです。最近のゲームでは、代わりにDirectXやOpenGLを使用することが多く、プログラマは最新のハードウェアの機能を使用することが可能です。


百科事典を検索する
AlegsaOnline.com - 2020 / 2025 - License CC3