DirectX とは

Page creation date :

The page you are currently viewing does not support the selected display language.

DirectX とは

DirectX とは簡単に説明すると、描画処理や音声関連、入出力デバイスなどをハードウェアレベルで処理させたいときに、プログラマがそれを深く意識することなくプログラミングできるようにまとめたライブラリのようなもの(API)です。ハードウェアで処理させるとソフトウェアで処理させるのに比べて格段に処理速度や性能面で向上します。特に最近はビデオカードなど画面出力系のハードの成長がめまぐるしく、3Dのリアルタイムレンダリングがより一般的になりつつあります。

DirectX は主に Windows 用ゲームなどに使用されていますが、3D関連ツールやビデオ編集ソフトなどにも使用され、ジャンルに制限はありません(同社製品でもあるゲーム専用機 Xbox 系でも使用可能)。

現在 DirectX は「Unmanaged DirectX」「Managed DirectX」の2つに区別されるようになっています。2つに分けられる前の DirectX は Unmanaged DirectX に分類されます(現在も DirectX といえば Unmanaged DirectX を指すことが多いです)。ただし、この2つの言葉は開発者側が使う言葉であり、DirectX を使用したソフトを使う側にとっては明示的に区別することはほとんどなく、一般的に「DirectX」と呼びます。

サンプル サンプル DirectX といえば3Dプログラミングが代名詞とも言える

Unmanaged DirectX

Unmanaged DirectX は以前からゲーム開発や3Dプログラミングなどに活用されており、ハードウェアの機能を有効に使えるということで重宝されていました。しかし、Unmanaged DirectX ならではの問題点もいくつかあります。(下の例は DirectX のフレームワークを使用していない場合の話です)

動的に確保したメモリやリソースは明示的に破棄しなければならない
Unmanaged DirectX を使用したプログラムは「C++言語」で記述されることが多く、その言語仕様から動的に確保したメモリやリソースは全てプログラマの責任で明示的に解放する必要があります。これは特に気を使う部分でもあり、きちんと対処しなければメモリリークというものが発生してしまいます。実はこれが意外と生産コストがかかってしまう部分でもあります。
DirectX 関連の初期化手続きが面倒
一度記述すればある程度使い回しができるのですが、DirectX で何かをやるまでにいろいろと記述しなければいけないコードが多く、初心者にとってこの部分は DirectX を学ぶ上で最初の障害になってしまいます。
記述すべきコード量が多くなる
上記の理由などにより結果的にコード量が多くなり、修正の手間や可読性の悪化など多くの問題を引き起こす可能性があります。

Managed DirectX の利点

Managed DirectX は Unmanaged DirectX の欠点を改善し、開発効率を大幅に上げることが出来ます。

まず、Managed DirectX は従来の DirectX のコードをクラスとしてラッピングし、とても理解しやすい形になっています。また、クラス化されているので簡単に利用できるようになっています。初期化関連の処理のも、このクラス化によって驚くほど簡単になっています。

さらに Managed DirectX は Microsoft .NET Framework と連携し、この環境下で作成されたコードはマネージドコードと呼ばれ、動的に確保されたメモリ、リソースをガーベジコレクションによって収集、自動破棄してくれるようになります。例えば、動的な配列の生成をした場合でも、その後メモリの破棄を意識する必要がほとんどありません。

最大の利点は Unmanaged DirectX に比べ明らかにコード量が減るということです。これは確実に作業効率のアップにつながります。もし Unmanaged DirectX を使ったことがある人なら、きっとこの差に驚くでしょう。

Managed DirectX の注意すべき点

Managed DirectX は Unmanaged DirectX に比べ遥かに汎用性、利便性が向上していますが、いくつか注意点が存在します。

処理速度がやや遅くなる
Managed DirectX は Unmanaged DirectX のコードをラップしている形になり、内部で Unmanaged DirectX のコードを呼び出す形になるので、その分処理の負担が増えます。しかし、これは CPU 側に関わる処理の負担であり、もし全体的な処理のうちハードウェアの負担割合の方が大きい場合、その差はほとんど気にならないでしょう。むしろ場合によっては Managed DirectX の方が早くなる可能性もあります(もちろんこれは処理内容や実行環境に依存します)。
情報が少ない
Managed DirectX は 比較的新しいので情報が少ないです。Unmanaged DirectX の方は前からあるものなので、こちらのほうが情報量が多いと思います。なので Managed DirectX を本格的に使用したい人でも Unmanaged DirectX について調べられるようにしなければなりません。
リソースは明示的に破棄する必要がある?
たしかに動的に確保したメモリは自動で破棄してくれますが、ビデオメモリを消費するリソースに関しては明示的に破棄する必要性があります。これはビデオメモリが通常のメモリのように豊富にあるとは限らないからです(もちろん通常のメモリもビデオメモリほどじゃないですが環境によっては少ないこともあります)。特にビデオメモリが少ない環境でガベージコレクションによるメモリの自動破棄を待っていては、新たにメモリを確保したいときに足りなくなる可能性があります。 また、リソースがどの順番で破棄してくれるかを簡単に把握できないので、特に破棄の順番が大きく関わるものに関しては注意が必要です。
法人関係は Unmanaged DirectX を使用していることろが大半
前述のとおり Managed DirectX は 比較的新しいものなので、実績は Unmanaged DirectX に比べるとほとんどありません。法人関係は利益を得ることが大前提なので、実績の少ない Managed DirectX に移行することはなかなか難しいようです。もし、DirectX を使用したソフトなどを開発している会社で働きたいと思う方は Managed DirectX だけでなく Unmanaged DirectX も使いこなせるようにしなければなりません。

理想的な形としては、初めに Unmanaged DirectX + C++ である程度経験をつみ、Managed DirectX を使ったほうが Managed DirectX の力を十分に発揮できると思います。

Managed DirectX のバージョン

現在 Managed DirectX のバージョンは 1.1 と 2.0 がありますが、現在サポートされているのは1.1のみです。2.0 は使用しないでください。今後 Managed DirectX は XNA に移行される可能性が高いです。

DirectX 関連のリンク