DirectX

更新日: 2004年 2月 15日(日)

DirectX について

他のサイトみてください。(゜;)\(--;)オイオイナニイッテンダヨ

さて、気を取り直して、 DirectX は元々Windows を動かすのが苦手な Windows で ゲームを動かすために作られました。初期の頃は、 Win G と呼ばれていましたが、16bitOS(Windows 3.1) から 32bitOS (Windows 95/NT)にOSのシステムを大きく改善したのと共に DirectX という名称に変更され、グラフィックス周りも直接グラフィックスカードにアクセスが可能なバイパスが組み込まれたことにより、グラフィックスの性能を飛躍的にスピードアップを可能にしました。

最近は、DirectX9 までバージョンアップされましたが、基本的な機能がそろい始めたのが DirectX 7 からです。このあたりから、グラフィックスの処理は、グラフィックスカードで行おうという指向が入り始めました。最近のグラボではグラボを制御し、シェーディングをもプログラムすることが出来るようになりましたが、まだその進化を問うようなゲームもあまり出ていませんが(^^ゞ

最初に話したように DirectX は元々ゲーム向けでしたが、DirectX7 から十分な機能を持ち始めたため、高レベルなマルチメディアAPIも操作することが出来るようになりました。内部的には COM という技術を使用しているため、プログラミングするのであれば COM についても知識が少し必要です。

それとDirectX はあくまでマルチメディアAPI なので、これ自体で容易にゲームが作れるという訳ではありませんが、高速に動くゲームを比較的簡単に作ることは可能になります。

COM について

Windows 95/NT から使われている OLE とか DDE とか Active X とかの課程を践んで、やっとこさ COM という名称になりました。ただ、最近では DCOM とか COM+ とかありますが・・・

説明が面倒なので、以下 OLE, ActiveX も COM と解釈してください。

COM は、コンポーネント・オブジェクト・モデルの略です。 Windows では、一度開発したオブジェクト(COM)を再利用しやすいような仕組みを作ったのが、COM のシステムの始まりになります。

たとえば、アプリケーションが利用している DLL を置き換えて、バージョンアップを行う。これは、Windows ですとわりと当たり前のアップデートの方法ですが、他のOS。たとえば UNIX では、"DLL" の概念がない(そもそも、UNIXではソースコードの互換性を重視した設計なので)ため、アップデートをするのでも、パッチ(ソースコードの差分だけ更新してくるプログラム)を当てて、アプリケーションのソースコードをコンパイルします。

Win と UNIX のアプリケーションのアップデートの方法を比べるとわかりますが、Win の場合は、ファイル単位でアップデートし、UNIX ではソースコードを直接修正するような違いがあります。Windows のCOM には、DLL をコンポーネントとみた時に、そのコンポーネントだけを更新することによりプログラムを修正することが出来ます。また、コンポーネントを他のアプリケーションとも同時に使用することが出来るため、プロセス間で1つのコンポーネントを共有できるので、各プロセスに同じコンポーネントをメモリへコピーせずに済みます。

COMは、要するにファイルを置き換えてバージョンをアップする仕組みやそのコンポーネントを他のアプリケーションと共有することでリソースの消費を押さえられたりするような仕組みを提供します。

あと、プログラミングで決定的に違う点が出ます。COM は、インタフェースを提供し、バイナリ互換を実現します。実は、C/C++言語は、UNIX から出てきたものですので UNIX と概念が同じで『バイナリ互換』はなく『ソースコード互換』です。ですので、単純に"DLL"だけを交換するだけは、思わぬ副作用(バグ)を生み出してしまうのですが、COM ではそれを回避する方法を取っているため、安全にDLLを交換することが出来ます。

ただ、そこら辺の仕組みを知らなくても DirectX を利用するだけなら問題ありません。COMを設計するには必要なスキルですが、COMの背景でも知ってもらえれば幸いです。

また、DLL = コンポーネント という解釈で説明してしまいましたが、実は EXE の場合もあります。また、DLL も C のエクスポート関数であれば、問題なく交換出来ます。問題になるケースは C++ の関数とクラスをエクスポートしたケースですが。

DirectX コンポーネント

では、 DirectX の話に戻って中身についてちょっと説明をしましょう。

使用するバージョンによって名称が異なるものもあるのですが、だいたい下のような感じです。

コンポーネント 機能概要
DirectDraw ラフィックス用のAPI。ディスプレイやビデオメモリを操作する。
Direct3D 3Dグラフィックス用のAPI。
DirectGraphics DirectX8 から DirectDraw と Direct3D が統合され、この名称に。インタフェース自体は、今までのDirect3Dを使用する。
DirectInput マウス、キーボード、ジョイパッドなどの入力デバイス用のAPI。
DirectPlay ロビーやチャットなど高レベルなネットワークAPI 。
DirectSetup ゲームのインストーラにDirectXのインストールが行えるようにするAPI。
DirectMusic MIDIやMIDIのようなインタラクティブなサウンドを鳴らすAPI。
DirectSound Waveファイルを同時に再生するAPI。
DirectAudio DirectX8 で Music と Sound が統合されたが DirectX9 では破棄? インタフェース自体は、今までのDirectMusic と DirectSound を使用する。
DirectShow ビデオ再生など高レベルなマルチメディアAPI。

DirectX でゲームを作成したのであれば、DirectGraphics と DirectAudio は必須でしょう。他は Win32API で代用してもそれほど大変でありません。ネットワークを使うのであれば、DirectPlay も UPnP に対応しているので、ネットゲームで P2P を使用するならかなり便利かなと。自前で UPnP を使う方法も見あたりませんし(^^ゞ

DirectX の開発で準備するもの

とりあえず、下のようなものがそろっていればOKです。

■ コンパイラ&エディタ

C/C++ 言語のコンパイラ、VB、Visual Studio .net なら C#, J# でもOKです。

ただ、VB,C#,J# など .net(シリーズ?)は、 C++ 版のがすべて移植されたわけではないVBのコンポーネントを使用するため、すべての機能を使うことが出来ないことがあります。

基本的には、どの言語を使用しても良いのですが、やはりマイナーな言語ほど資料が見つかりにくいのは覚悟しなければなりません(^^ゞ。あまり、マイナーな言語(自信があるのでしたらかまいませんが)はお奨めしません。

あと、C言語もいい加減お奨めできません。新しい DirectX の SDK には C 用のヘッダーが含まれなくなってきたので、C 言語で開発する敷層が高くなってしまっています。COMに詳しい人はこれくらいの壁なんか、簡単にクリアできるのですが、わからない人はお奨めできません。

個人的に一番お奨めなのは Visual Studio ファミリーの Visual C++ 2003 です。やっとC++標準規格に準拠したと呼べるようなコンパイラが出ました(^^ゞ。

チャレンジャーな方は C# でも。ただ、C#も新しい言語なので微妙に問題あるんですよね・・・

また、一番使われているのは Visual  C++ 6 だとは思います。古い開発環境ですが、 Platform SDK をダウンロードすることで、Windows 2003 Server などの最新版の開発用のライブラリも使用できるようになります。

あと、MS 以外の言語・コンパイラを使用する場合、配布されている DirectX の SDK が Visual Studio 用なのを気をつけなければなりません。

なので、BCB などを使う場合は、一度 VC 用のものから BCB 用のライブラリに変換を書ける必要があります。ただ、私は純粋なVCプログラマなので、この方法は詳しくないので、他のサイトを当たってください。

エディタは、VC や BCB は総合環境なので付いています。エディタとは、ソースコードを編集するソフトのことです。コンパイラ単品のBCCなどでは、別途必要な場合があります。さすがにメモ帳を代用するのはこれからの長い開発で足を引っ張ります。

■ DirectX9 SDK

これがなければDirectXの開発は始まりません。DirectXのソフトウェア開発キット(SDK)です。一般的にSDKには

などが入っています。

DirectXのドキュメントは、昔日本語版が無かったころ、英語の翻訳版で本屋に並びました。その厚さは、人を殺せるくらい(?)のもので、値段も万札を使うくらいの値段でした。そんなものが、無料が手にはいるようになったのでお得?というわけでないですが、かなりの情報量が載っています。また、うちのサイトよりどちらかというと、そちらのドキュメントの方が詳しいと思います。。。

ダウンロードは、次の場所で行えます。また、同サイトでもプログラムの例も紹介していますが、レベルが高いのしか載っていませんが(^^ゞ

MSDN Online ( DirectX )
http://www.microsoft.com/japan/msdn/directx/default.asp

次回予告

無駄な長話をしてしまって、なにもやらずに終了。

次回は、開発環境 ( Visual Studio 6) にインストールする手順を説明します。たぶん、DirectX 9 しか SDK が配布されていないと思うので、開発環境が VS 2002/2003 の場合は、インストーラが勝手にやってくると思います。なので、対象外の VS6 でパスを通してコンパイルしてみます。

■ See Also