Direct2Dのお話。

Direct2Dについて考えてみた。

先日、『Fy Slideshow』の最新版をリリースしました。実を言うと、表示時間に関する致命的なバグの修正が最重要課題だったり。。。

このバージョンアップで、Windows 7で新たに導入された2D表示機能である『Direct 2D』による描画機能を搭載させました。実装しておいてなんですが、まだ『Direct 2D』についての理解がいまいちなんですが、プログラムを書いた経験を踏まえて『Direct 2D』に関する考察をしてみることにします。

イメージ イメージ

(左 『Fy Slideshow』、右『設定画面』)

まず、『Direct 2D』について簡単にお話しします。

Windows の GUI(ウィンドウとかの描画機能)は、Windows 3.0の時代から『GDI』とよばれるAPIが担っていました。今で言うクラシックスタイルの原型を作ったWindows 95よりも前、16bitの時代に確立された長い歴史を持つ技術です。各Windowsがリリースされるごとに機能を追加し、Windows XPでは『GDI+』と名前がかわり比較的大規模なアップデートも行われましたが、しょせんは『+(プラス)』ですから基本が同じであることは一目瞭然です。

この『GDI』を一言で言ってしまえば、『アプリケーションとハードウェアとの間をうまいことやってくれる機能』です。これのおかげで、グラフィックチップが『Radeon』だろうが、『Geforce』だろうが同じウィンドウが表示されまし、『EPSON』のプリンターでも『Canon』のプリンターでも、まぁまぁ似たような印刷物ができあがるわけです。

ところが、様々なハードウェアでもヨロシクやってくれるようにする機構のため、ハードウェアの能力を最大限に生かすのには向かず、またオーバーヘットも多かったため、ゲームのような素早い動きが必要なアプリケーションだとモッサリしてしまう問題がありました。このため、速度の必要なゲームは長らく高速な処理が可能なDOSが主流でした。

DOS ではプログラムがハードウェアを直接制御していたので、『GDI』とは逆にハードウェアの能力を最大限に生かしオーバーヘットも少ない反面、アプリケーションはハードウェアに制限されてしまい、また安定性もプログラムに大きく左右されていました。例えば、DOS時代のサウンド機能は『Sound Blaster』がデファクトスタンダードで、ほとんどのゲームが『Sound Blaster』(または互換品)以外では音が鳴りませんでした。

そこで、Windowsでもゲームを普及させるべく、ゲームなどに向けた新しいAPIとして『DirectX』というものが用意されました。これは、どちらかと言えば『GDI』に近く、ハードウェアを意識せずにヨロシクやってくれるにはくれるものの、『GDI』よりもハードウェアに密着し、ハードウェアの能力を生かしつつオーバーヘッドも少なくなるようにしたものです。ただし『GDI』よりもハードウェアの制約を受けやすく、『DirectX』対応のゲームには、ハードウェアスペックに『DirectX ○以上のグラフィックチップを搭載していること』のように書かれていることからも見て取れます。

このような経緯から、速度が必要なゲームやマルチメディアアプリケーションなどは『DirectX』を使い、それ以外の一般的なアプリケーションは『GDI』を使うことでWindows Vistaまできました。

イメージ

Windows Vista以前のGDIとDirectXのイメージ

ちなみに、『DirectX』は、『Direct3D』や『DirectSound』、『DirectShow』などの総称で、『Direct(ほにゃらら)』という意味です。『プロジェクトX』の『X』と同じですね。ちなみに、この『DirectX』の中身なのですが、『Direct3D』以外は、入れ替わり立ち替わりで追加されたり、名前が変わったり、統合されたりとけっこう変化しています。

さて、Windows Vistaでは、GUIもグラフィックチップの性能を最大限生かして描画しましょうね、みたいな話で『Desktop Window Manager』という技術が導入されました。皆さんから見れば、『Aero Glass』が導入されてアプリケーションがモッサリしたというのがソレですw

『Desktop Window Manager』は基本的には『Direct3D』を使っています。それまで、『GDI』と『DirectX』という2つの描画手法が共存していて、それぞれ直に画面に表示されるようなスタイルでしたが、Windows Vistaでは描画は『DirectX』に一本化されて、『GDI』は一旦『Direct3D』に転送されて表示されるようになりました。Windows Vistaでアプリケーションの表示がモッサリした理由はいくつかありますが(GDIのハードウェアアクセラレーションの無効化など)、それまで『GDI』が直に描画されていたのに対して『Direct3D』を経由するようになったことによるロスもその大きな理由の一つでした。

イメージ

Windows VistaのGDIとDirectXのイメージ

問題なのは、「では『GDI』を使わない方法はあるのか?」と言った時に、WPFという新しいプログラミング方法を使ってアプリケーションを作る以外になかった点です。WPFは.Net Frameworkを使った新しいプログラミング方法なのですが、現在でも通常のアプリケーションで普及しているとは言い難い状況です。つまり、 Windows Vistaでは、『GDI』を使ってモッサリするか、『WPF』という新しいプログラミング方法を使ってアプリケーションを作り直すかの2択という状況だったわけです。

MicrosoftはWindows 7を開発するにあたり、Windows Vistaの評判に対する回答として、モッサリ解消に向けて数々の対策を行いました。その一つが『GDI』に変わる新しい2D表示機能である『Direct2D』です。名前は『Direct2D』ですが、『Direct3D』と同格というわけではなく、内部的には『Direct3D』を機能拡張して2D表示に対応させた部分の名称というもののようです。また、『Direct2D』のうち文字描画機能として『DirectWrite』という機能も用意されました。『Direct2D』は『DirectX』ファミリーのため、通常のC++でプログラムを書くことができます。ここはWPFとは異なりアプリケーションを作る側にとっては障壁が低いものとなります。

イメージ

Windows 7のGDIとDirectXのイメージ

『Direct2D』の導入で、通常の2Dアプリケーションでも『GDI』ではなく直接『Direct3D』としてデスクトップに描画することができるようになったのです。『DirectX』はその生い立ちからも、ハードウェアの能力を生かすように設計されており、『Direct2D』も『GDI』よりもグラフィックチップの能力を活用して高速でなめらかな描画をCPUに負荷をかけずに表示することが可能になっています。

で、前置きが非常に長くなりましたが。。。

『Direct2D』ですが、思ったよりも使いづらかったというのが印象です。

プログラムをしてみて感じた問題点を3点挙げてみます。

1.プログラミング手法が『GDI』とは違う

『Direct2D』は『DirectX』ファミリーですので、『DirectX』とプログラミング手法は非常によく似ているように見えますが、逆に『GDI』とはかなり異なるプログラミング概念のように感じました。そういった意味で、『DirectX』を扱ってきた人にとっては障壁は低いものであることは確かなのですが、上記の通り『DirectX』は今までゲームや一部のマルチメディアアプリケーションにしか使われていなかったので、多くの通常のアプリケーションを作ってきた人にとっては新たなジャンルということになります。

さらに、『GDI』と『Direct2D』の相互のやりとりはあまり考慮されていないようです。もともと、プログラミング手法が大きく異なるので難しいのかもしれませんが、GDIを前提に作ったアプリケーションを描画部分だけ『Direct2D』にするような作り替えは難しいようでした。例えば、『Fy Slideshow』では『Direct2D』で画像を表示するのにあたり、画像ファイルの読み込み部分から別経路にした方が、読み込んだ画像を『Direct2D』向けに変換するよりもずっと楽でした。

2.対応OSに制限がある

Direct2DはWindows Vista/7以外では使えません(Windows Vistaはアップデートで対応)。したがって、それ以前のOSに対応させるにはGDIとDirect2Dの両方の描画機構を用意して環境に応じて使い分ける必要があります。その時に、上記の相互のやりとりが考慮されていない事が大きな負担になります。また、Direct2Dは『クラス』として提供されているので、関数のように動的に対応させたりすることが難しいです。私は『Direct2D』での処理をモジュール(dll)にまとめることで、動的に切り替えができるようにしました。

イメージ

『Fy Slideshow』で作ったモジュール(32bit版と64bit版)

対応OSの問題はいずれ解決していくことと考えられますが、Windows XPが対応していないため相当の時間がかかることが見込まれます。時代はクライアント主導の時代からサービスとの融合を目指したクラウドな時代に突入しつつあるように見えます。そうなってくると、プラットホームはOSではなくブラウザということになっていくのかもしれません。そうなると、Windows XPの寿命は今までのOS以上に長くなっていく可能性があります。

3.性能差がよくわからない

画像が高解像度化されて表示されるようになるとか、文字がMacよりも美しくなるとか、目に見えた変化があるならば対応させるメリットもあるのですが、切り替えて色々試してみましたが、劇的な変化は感じられませんでした。描画速度に関しても『Direct2D』でもそれなりにモタつきますし、『DirectWrite』で書いた文字も輪郭はギザギザして見えました。ましてやかなり多くの書き換えを要し、プログラミング手法の変更までして行った結果としては、ちょっと魅力に欠けると言わざるをえません。

ということで、『Direct2D』が爆発的に普及することは難しいのではないかと私は思うのです。Internet Explorerの次期バージョンが『Direct2D』を採用するなどの話も聞かれ、順風満帆のようなイメージもあるものの、全体を見ると『GDI』から『Direct2D』に主流が移行する時代は当分先か、ひょっとしたら来ないかもしれないと考えています。

『GDI』は確かに、15年以上も前に作られた技術を基本としており、その間の各方面での機能拡張で複雑怪奇になってしまっている感は否めません。しかし、『GDI』の基本コンセプトは『アプリケーションとハードウェアとの間をうまいことやってくれる機能』です。その意味で考えれば、アプリケーションは今まで通り普通にGDIを使って描画すると、グラフィックチップの能力を活用して高速に美しく表示してくれる、というのが新しいWindowsに搭載される『GDI』の理想的な姿ではないのかな?と思うのです。

ま、新しい勉強をしたくないプログラマーの戯言ではありますが、新しい言語を勉強する必要があるならば別に Windowsアプリケーションにこだわる必要もなく、iPhoneのプログラムあたりにチャレンジしちゃおうかなぁ~とかも言えるわけですから Microsoftとして良いことではないでしょう。

今はクラウドコンピューティングへの移行期で、クライアントで動作する普通のアプリケーション(リッチクライアントと呼ばれるらしい)から、クラウドを活用したブラウザ上で動くアプリケーションのスタイルが主流になっていくかもしれません。そんな先の見えない次期に、クライアントで動作するアプリケーションの新しいプログラム手法を学ぶのはちょっと気が進みません。それならば、最新の HTML5やAdobe AIRをやってみるとか、同じMicrosoftのプログラミング言語でもSilverlightなどの方が将来性がありそうな気がします。

そんな情勢を含めて、次期Windowsの『GDI』と『Direct2D』の関係がどうなっていくのか興味深いところなのです。

Direct 2D をサポートするハードウェアは?

Direct 2Dを検証するために買ったわけではないのですが、DirectX 11対応のRadeon 5450を買いました。3Dゲームなんてしないのに、グラフィックカードを買い換えてもあまり意味はないのですが、低消費電力+ファンレス、 DirectX 11対応は魅力的です。ちなみに長らくGeforce系を使っていましたが、昔はATIのRadeon(初代)をかなり長い間愛用していました。ちなみに、そのRadeonは半年くらい前まで家族用マシンで現役でした。

イメージ

もともと3Dゲームをしない私にとっては、発色が自然で美しいと定評のあるATIの絵作りが気に入っていましたが、ドライバーのデキがGeforceの方が良いということでGefoceを使っていました。ネットを見回しても私と同じようにドライバーを理由にGeforceを選んでいる人は結構見かけるので、ATIさんはそこはがんばってほしいところですね。

今回買ったのはRadeon 5450でRADEON 5xxxシリーズでもっともエントリーレベル。正直3DゲームをしないのでRadeonでもGeforceでもエントリーレベルの製品しか眼中にありません。nVIDIAの製品はどういうわけかここ数年、エントリーレベルの製品でもファンが搭載して結構発熱もするのに対して、ATIはエントリーレベルの製品はファンレスで消費電力が低いのは大変魅力的です。もともとATIはモバイル系の製品を古くから開発しているメーカーなので、省電力なチップの開発能力に長けていると言えます。

Radeon 5450のスペックについては、4GamerやPC Watchあたりの大御所に詳しく掲載されているのでそこを参考にしていただくとして、基本的には3D性能が低いものの、5xxxシリーズは基本的には『できること』に違いはありません。Windows Vista/7のAeroを使っている場合はわかりませんが、Windows XP以前の環境ならば3Dゲームをしない場合は遜色がないと言って良さそうです。

さて、表題の『Direct 2D』についてなのですが、前回のブログで『描画性能に大きな差は感じられない』と書いたのですが、よくよく考えてみるとテスト環境で使った Geforce 8500GTはDirectX 10までの対応なので、DirectX 10.1の仕様であるDirect 2Dはハードウェアサポートされていない可能性が高いということに気づきました。もっとも、DirectX 10世代以降だと汎用性の高いハードウェア構成になっているので、ひょっとするとDirectX 10.1くらいであればドライバーの作り次第では対応できそうな気はしますが。。。

イメージ

そこで今回DirectX 11に対応した Radeon 5450 を搭載したことで、ひょっとしたらDirect 2Dの真の能力を発揮できるかもしれないと思い、ちょっと調べてみました。まず、DirectX のバージョン情報を調べてみました。実は交換前のスクリーンショットを取り損なったので、上はMac-miniのGeforceのスクリーンショットです。

イメージ イメージ

(Geforce 9400 DirectX 10対応)

イメージ イメージ

(Radeon 5450 DirectX 11対応)

DirectXのバージョンはどちらもDirectX 11、ドライバーモデルもWDDM 1.1で同じです。DirectXのバージョンはOSにインストールされているDirect Xのバージョンだと思われるので、おそらく初代RadeonでもDirectX 11となることが見込まれます。ドライバーモデルはドライバーに依存しているので、WDDM 1.1に対応したドライバーモデルに対応したドライバーであればハードウェアでサポートされている機能には依存しないようです。

違いはDDIバージョンで、これはどうやらハードウェアがサポートするDirectX のバージョンと関連しているようです。ただ、気になるのはRadeon 5450のDDI バージョンが10.1になっていること。なぜ?

で、実際にDirectX 10.1をハードウェアでサポートしたグラフィックカードを搭載した場合、通常の描画(以下GDI)とDirect 2Dによる描画とで差がでるか実際に試してみました。違いが出るとしたら、『速度』と『負荷』と『絵作り(発色等)』ですね。

速度はどちらも充分にあるので、ちょっとした画像の表示に差はありませんでした。しかし『絵作り』の点では、Geforceの時は『GDI』も『Direct 2D』も全く同じに見えましたが、Radeonは『Direct 2D』の方が発色が若干鮮やかに変化したような気がしました。また、CPU占有率に関してはRadeonの方が明らかに差がでているなど、やはり DirectX 11対応のRadeon 5450の方がハードウェアによる処理が増えているようです。

もっとも、ここまで言っておいてなんですが、2D処理は実用で大きな差がでるような高負荷な処理でもないので、普通に使う分はどちらでも違いは感じられないかもしれません。