Vistaの地平 第5回 Vistaのハードウェア要件 Column
デジタルアドバンテージ 打越 浩幸 |
|
|
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機能を利用して、従来とはまったく異なるウィンドウ・システムを実現している。見た目は従来と同じであるが、その内部は大きく変わっている。
まずは従来のウィンドウ・システムについてみてみよう。
左上の濃い黄色の部分は、グラフィックス・カード上のメモリ(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]キー押下時に表示されるサムネイル)、タスク・バー・サムネイル(タスク・バー上のアイコンの上へマウスカーソルを移動させたときに表示されるサムネイル)などでも、このバッファ・ウィンドウの内容が表示されている。
ところでこのウィンドウ・システムであるが、欠点もある。膨大な量のグラフィックス・メモリ(とGPU機能)が必要になるということだ。図から分かるように、アプリケーションごとに固有のウィンドウ用バッファ・メモリ(テキスチャ・バッファ領域)が必要になる。ウィンドウの数が多ければ多いほどVRAM領域を消費する。テキスチャ・マップで利用するため、このバッファはVRAMとして確保しておく必要がある。またGPUが利用できなければ、これらはCPUに負担をかける、非常に重い処理になってしまう。これがVistaで大量のグラフィックスVRAM(とGPU機能)を要求する理由である。アプリケーションを同時にたくさん開くためには、大量のVRAMが必要となる。といっても、128Mbytesもあれば100ウィンドウ程度は開けるので、実用上は問題ないことが多い(VRAMが足りなくなると、Aero機能がオフになる)。
これ以外にもVistaの描画アーキテクチャではいくつか特筆すべきものがあるが、Vistaのハードウェア要件の話題とは大きくそれるので、ここでは省略する。いずれ回を改め解説したい。
関連記事 | ||
.NET&Windows Vistaへ広がるDirectXの世界(Insider.NET) | ||
INDEX | ||
Vistaの地平 | ||
第5回 Vistaのハードウェア要件 | ||
1.システムの構成を調査する | ||
2.Windowsエクスペリエンス・インデックス | ||
【Column】改良されたVistaの描画アーキテクチャ | ||
「 Vistaの地平 」 |
- Azure Web Appsの中を「コンソール」や「シェル」でのぞいてみる (2017/7/27)
AzureのWeb Appsはどのような仕組みで動いているのか、オンプレミスのWindows OSと何が違うのか、などをちょっと探訪してみよう - Azure Storage ExplorerでStorageを手軽に操作する (2017/7/24)
エクスプローラのような感覚でAzure Storageにアクセスできる無償ツール「Azure Storage Explorer」。いざというときに使えるよう、事前にセットアップしておこう - Win 10でキーボード配列が誤認識された場合の対処 (2017/7/21)
キーボード配列が異なる言語に誤認識された場合の対処方法を紹介。英語キーボードが日本語配列として認識された場合などは、正しいキー配列に設定し直そう - Azure Web AppsでWordPressをインストールしてみる (2017/7/20)
これまでのIaaSに続き、Azureの大きな特徴といえるPaaSサービス、Azure App Serviceを試してみた! まずはWordPressをインストールしてみる
|
|