Vistaの地平
第5回 Vistaのハードウェア要件

Column
改良されたVistaの描画アーキテクチャ

デジタルアドバンテージ 打越 浩幸
2007/03/22

GDIとDirectXアプリケーションの融合

 Vistaでは従来のWindows OSから描画のアーキテクチャが大きく変更され、DirectX(GPU)を積極的に使うようになっている。従来は、一般のアプリケーションはGDI/GDI+、ゲームやマルチメディア・アプリケーションはDirectXと2つに分かれていたが、これを1つに統合することにより、通常のアプリケーションもマルチメディア・アプリケーションも、そしてゲームも同じコンソールを共有しながらシームレスに連携して動作できるようになる。例えばワープロの画面の中に動画を貼りこんでスムーズに再生して見せる、といったことが簡単にできるようになる(従来はGDIとDirectXを混在させて使うなどということは用意ではなかった)。

 このあたりの事情を図にすると次のようになる。これは従来のアーキテクチャである。GDIとDirectXという2種類のAPIに対して、それぞれデバイス・ドライバが別々に用意されている。

従来のアーキテクチャ
GDI/GDI+系APIと、DirectX系APIは別々に用意されている(元々別々に進化してきたからだ)。XP Display Driver Modelは、後述のWDDMと比較して、XPDMとも呼ばれる。

 これに対してVistaでは次のようになっている。GDIやDirectXというAPIはそのまま残っているが、内部ではすべてDirectXベースに置き換えられている。最終的にはすべてDirectXベースで描画が行われている。

Vistaのアーキテクチャ
Vistaでは、すべてDirectXベースで描画が行われる。これをサポートするために用意された新しいドライバ・アーキテクチャがWindows Vista Display Driver Model(WDDM)である。従来のGDIやGDI+のAPIは、Vistaでもそのまま残っているが、内部ではDirectXを使った描画に置き換えられている。これにより、互換性を保ちながらDirectXベースで動作するようになっている。Aeroを利用するためにはWDDMをサポートしたグラフィックス・カードが必要。

 このような大幅な変更が行われた理由は、グラフィックス・カードの持つ高度な演算処理能力(GPUの処理能力)を描画に生かしてホストCPUの負担を下げたり(その分、ほかの処理に費す)、(先に述べたような)シームレスなマルチメディア・アプリケーションを実現したりするためである。GPUの機能や性能は急速に向上しているが、従来はそれを生かせるアプリケーションとしてはゲームぐらいしかなかった。それをビジネス・アプリケーションなどでも有効に活用できるようになった。

グラフィックス・カードの機能を活用したウィンドウ描画システム

 DirectX(Direct3D)は、グラフィックス・カードの持つ3Dグラフィックス機能を活用するためのAPIセットである。Vista(のAero)ではウィンドウの描画でもこの3D機能を利用して、従来とはまったく異なるウィンドウ・システムを実現している。見た目は従来と同じであるが、その内部は大きく変わっている。

 まずは従来のウィンドウ・システムについてみてみよう。

従来のウィンドウ・システム
(Windows 1.x以来の)従来のウィンドウ・システムでは、少ないVRAMメモリを複数のアプリケーション・ウィンドウで共有して使うため、それぞれ、自分の担当する部分(ディスプレイ上で見えている部分)のみを責任を持って描画する、という方針で動作していた。ウィンドウの移動などで新たに見える部分が出てきた場合(露出した場合)、その部分だけを再描画していた。
※なおマインスイーパはゲーム・アプリケーションの例として取り上げただけであり、このゲームが実際にダブル・バッファを使っているというわけではない。

 左上の濃い黄色の部分は、グラフィックス・カード上のメモリ(VRAM)である。このVRAMの中には、実際の表示スクリーンに相当するメモリ領域があり、そこにデータを描くと、その内容がそのままディスプレイに表示される。つまり、Windows OSやアプリケーションがこの部分にデスクトップ背景やアプリケーション画面を描画すれば、それがそのままユーザーから見える画面になる。

 この例では3つのアプリケーションが、1つのデスクトップにそれぞれ描画しようとしている。だが各アプリケーションのウィンドウは、ほかのウィンドウに隠されたり、画面からはみ出したりしていて、すべて見えているわけではない。例えばワープロ・ウィンドウの上には、Webブラウザとゲーム・ウィンドウが重なっており、Tの字型になっている。つまり、ワープロ・アプリケーションが描画しなければならない領域は、Tの字型の領域内だけである。同様に、ほかのアプリケーションも、自分の担当しているウィンドウの、露出している(表に出ている)部分のみを描画すればよい。

 ところで下側の2つのアプリケーションが最小化され、ワープロ・アプリケーションだけになったとしたらどうだろうか。ワープロ・アプリケーションは、新しく「露出」した部分(表に出てきた部分)に対して、自分の責任で描画をしなければならない。これを「リペイント(再描画)」という。つまり、ウィンドウの位置関係が変更されるたびに、各アプリケーションは自分のウィンドウを自分でリペイントするのである。

 ウィンドウが動いたり、上下関係が変わるたびにリペイント・イベントが発生することになる。だが、たくさんのアプリケーションで少ないメモリ(画面1枚分のメモリ)を共有するためにはしょうがないだろう。

 なお、右下のゲームの画面は少し異なった手法を取っている。まずVRAMのある場所(ディスプレイには表示されない場所)に1度描画し、それをVRAM上で転送している。これはゲームなどでは良く使われている方法である。リペイントが遅いと、画面がチラついたり、ユーザから描画している過程が見えたりしてしまうが、VRAM間転送は高速なので、こうやるとユーザーからリペイントが見えなくなる。またリペイント処理も少し簡素化され、高速になる。VRAMに余裕のある場合には有効な方法だ(一般的にはボタンやアイコンなど、小さなGUIの部品などをこうやってVRAM上に置いておき、必要に応じて転送することが多い)。

 次はVistaのウィンドウ・システムを見てみよう。

Vistaのウィンドウ・システム
VistaのAero環境下では、アプリケーションは自分自身のバッファ(テキスチャ・バッファ)までの描画しか担当しない。それらのバッファを集め、デスクトップ画面として描画する(合成する)のはDesktop Window Manager(DWM)の担当である。

 先ほどと比べると、すべてのアプリケーションがまずVRAM上にいったんウィンドウ・イメージを構築し、それを最終的な表示画面領域へ転送(図中では「合成」と表記)しているのが分かるだろう。つまり先ほどのゲーム・アプリケーションのように、まずは中間的なウィンドウ・イメージを作成し、それをVRAM間で転送して表示している。

 さらによく見るとわかると思うが、各アプリケーションのウィンドウがほかのアプリケーションによって覆い隠されることがない。アプリケーションはVRAM上の決まったバッファ領域に描くだけなので、常にウィンドウ全体の内容を描くことができる。隠されることがないので、部分的なリペイント領域を計算する必要もない(実際にはリペイントがまったく不要になるわけではない。回数が非常に少なくて済むようになるだけである)。

 さてアプリケーションのバッファに描画されたウィンドウのイメージは、今度はAeroのDesktop Window Manager(DWM)によって、中央にある表示用領域へ合成される。このときに使われるのがDirectXの3D描画機能だ。デスクトップ上のウィンドウには前後の関係(上下関係というべきか)があるが、実はそれは3Dオブジェクトの前後関係として実際に配置されている。そしてその配置された矩形オブジェクトに対して、アプリケーション・ウィンドウの内容をテキスチャとして貼り込んでいる。つまり、Aeroにおけるデスクトップ・ウィンドウは3Dオブジェクトとして実現されているのである。また、ウィンドウの裏が透けて見えているが、それは本当に裏(下)にある別のウィンドウが透けて見えているのである。ただしぼかし処理をしているが(これらの処理にはピクセル・シェーダを使っている)。

 DWMは、適当なタイミングで各アプリケーションのテキスチャ・バッファを集め、それを3Dで合成して表示している。実際にはダブルバッファの技法を使っているので、描画に伴うチラつきもない。ダブルバッファとは、表示用のバッファを2つ用意しておき、表示用と描画用を切り替えながら(交替させながら)扱う方法のことである(図中の2つのバッファ参照)。

 Vistaではこのようにしてウィンドウを描画しているが、利点がいくつかある。先ほど述べたように、ウィンドウの移動などに伴うリペイントが発生しないので、無駄なCPU時間の消費が抑えられる。アプリケーションは自分自身のバッファ内にさえ描画しておけば、あとはすべてDWMが処理してくれる。DWMの処理の大半はグラフィックス・カードのGPU内で行われるので、CPUの負担は少なくて済む。

 またFlip 3Dといった機能も簡単に実現できることが分かるだろう。あの機能は、3D空間中に斜めになった平面オブジェクトを並べて配置し、それらのオブジェクトにアプリケーションのバッファ・ウィンドウをテキスチャとして貼り込んでいるのである。さらに、最大化/最小化時のアニメーションやウィンドウ・フリップ([Alt]+[Tab]キー押下時に表示されるサムネイル)、タスク・バー・サムネイル(タスク・バー上のアイコンの上へマウスカーソルを移動させたときに表示されるサムネイル)などでも、このバッファ・ウィンドウの内容が表示されている。

Flip 3Dによるウィンドウ切り替え画面の例
[Windows]+[Tab]キーを押すか、[スタート]ボタンの右隣にある[ウィンドウを切り替える]というボタンをクリックすると、このような3D形式のウィンドウ切り替え画面が表示される。利用可能なウィンドウが奥行きを持って重なって表示され、目的のウィンドウを探しやすくなっている。ここでは分かりやすいように、メッシュ状の罫線を描画したウィンドウを多数表示させている。Flip 3Dでは、平面オブジェクトを3次元空間上に奥行きを持って重ねて配置し、アプリケーションのバッファ・ウィンドウの内容をそのオブジェクトの表面へテキスチャ・マッピングして表示している。ここでもGPUの機能がフルに活用されている。

 ところでこのウィンドウ・システムであるが、欠点もある。膨大な量のグラフィックス・メモリ(とGPU機能)が必要になるということだ。図から分かるように、アプリケーションごとに固有のウィンドウ用バッファ・メモリ(テキスチャ・バッファ領域)が必要になる。ウィンドウの数が多ければ多いほどVRAM領域を消費する。テキスチャ・マップで利用するため、このバッファはVRAMとして確保しておく必要がある。またGPUが利用できなければ、これらはCPUに負担をかける、非常に重い処理になってしまう。これがVistaで大量のグラフィックスVRAM(とGPU機能)を要求する理由である。アプリケーションを同時にたくさん開くためには、大量のVRAMが必要となる。といっても、128Mbytesもあれば100ウィンドウ程度は開けるので、実用上は問題ないことが多い(VRAMが足りなくなると、Aero機能がオフになる)。

 これ以外にもVistaの描画アーキテクチャではいくつか特筆すべきものがあるが、Vistaのハードウェア要件の話題とは大きくそれるので、ここでは省略する。いずれ回を改め解説したい。End of Article

関連記事
  .NET&Windows Vistaへ広がるDirectXの世界(Insider.NET)
     
   
 INDEX
  Vistaの地平
  第5回 Vistaのハードウェア要件
    1.システムの構成を調査する
    2.Windowsエクスペリエンス・インデックス
  【Column】改良されたVistaの描画アーキテクチャ
 
 「 Vistaの地平 」


Windows Server Insider フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Windows Server Insider 記事ランキング

本日 月間