連載
.NET&Windows Vistaへ広がるDirectXの世界

第3回 .NET開発者のためのDirectX連携手法

NyaRuRu
Microsoft MVP Windows - DirectX(Jan 2004 - Dec 2006)
2006/10/04
Page1 Page2 Page3

Windows Presentation Foundation(WPF)

 WPFの特徴は、次のようなものだ。

  • デザイン・ツールや豊富なサンプル、GUIコンポーネントなど、ウィンドウ・アプリケーション開発での生産性に重点が置かれている
  • ハードウェア性能に応じて、最適な描画方法が内部的に使用される

 WPFがリアルタイム・アプリケーションに不向きかというとそういうことはなく、むしろWPFは時間変化のあるコンテンツを積極的に使っていこうという設計になっている。また、ムービーをテクスチャに貼り付けるといった、従来から不可能ではないが実装が面倒であった処理が非常に簡単に利用できるようになるのも特徴である。いわゆるノベルタイプ・ゲームなどは、WPFの利用を検討した方がよいかもしれない。

 生産性を重視する一方で、ハードウェア機能を積極的に利用したスケーラビリティも期待できる。

 WPFのアンマネージ層である「Media Integration Layer」(以下MIL)は、Window Vistaで導入される最新のネイティブDirectX(Direct3D 9Ex)の機能から、ソフトウェア・エミュレーションによる描画までを自動的に使い分け、ハードウェア性能に応じた描画方法を選択してくれる。このため、開発者やデザイナーはこういった環境ごとの最適化をランタイム・ライブラリに任せ、アプリケーションの制作に専念することができるのだ。

 そのスケーラビリティについては、Windows VistaのAero環境をご覧になればお分かりになるだろう。Aero環境ではDirect3D9Exの機能を駆使してウィンドウ描画が行われるが、実際の描画エンジンについてはMILが使用されている。WPFを使用すれば、Aeroを実現しているのと同等のハードウェア・アクセラレーションが期待できることになる。

 なお、WPF経由のときとネイティブ利用のときのDirectXの描画結果をそれぞれ連携させることは難しく、用途に応じてどちらか一方を選択する方がよい。

Managed DirectX(MDXまたはDirectX for Managed Code)

 Managed DirectX(DirectX for Managed Code。以下MDX)はマイクロソフトのTom Miller氏を中心に作成され、DirectX SDKに付属しているライブラリで、C#をはじめとした.NET言語からネイティブDirectXを使用するための.NETラッパー・ライブラリだ。衛星写真を元にした地球儀ソフトの先駆けとなった、NASA World Windへ採用されたことでも有名である。

 MDXには.NET Framework 1.0をターゲットとしたMDX 1.0、.NET Framework 1.1をターゲットとしたMDX 1.1が存在する。しかしMDX 1.0は利用者も少なく、バグ・フィックスなども行われていないことから、すでに廃止されたものと考えるのが妥当だろう。

 また、NET Framework 2.0をターゲットとしたMDX 2.0も存在し、以前はベータ版がDirectX SDKに付属していたが、これがXNA FrameworkにおけるCore Frameworkの原型となっている。ただしMDX 2.0ベータ自体のリリースは2006年4月リリースで凍結されており、今後はXNA Frameworkに一本化される。

 なお、多くのベータ製品同様にMDX 2.0ベータ版にも使用期限が存在するため、2006年10月5日以降は現在出回っているMDX 2.0ランタイム・ライブラリが使用できなくなる。MDX 2.0ベータを使用していた開発者は、早急にその他の技術に移行する必要があるだろう。なお、MDX 1.1のセキュリティ・フィックスなどについては、今後も通常通りのサポートが続けられるとのことだ。

 また、.NET Compact Framework 2.0には、MDXのサブセットが標準で組み込まれており、Windows Mobile 5.0などが提供するDirectX Mobileの機能を利用することができる。

 MDX 1.1の特徴は、主要なDirectXコンポーネントが一通りサポートされているということだ。次の表は、DirectX SDK August 2006に付属するMDX 1.1のアセンブリ一覧だ。Microsoft.DirectX.Direct3DXのバージョン違いが大量に存在するのは、2カ月ごとのD3DXライブラリの更新を反映してのものである。新しく開発を始める場合は、基本的に最も新しいMicrosoft.DirectX.Direct3DXアセンブリを参照しておけばよい。

コンポーネント名 アセンブリ・バージョン ランタイム・バージョン
Microsoft.DirectX
1.0.2902.0
v1.1.4322
Microsoft.DirectX.AudioVideoPlayback
1.0.2902.0
v1.1.4322
Microsoft.DirectX.Diagnostics
1.0.2902.0
v1.1.4322
Microsoft.DirectX.Direct3D
1.0.2902.0
v1.1.4322
Microsoft.DirectX.Direct3DX
1.0.2902.0
v1.1.4322
Microsoft.DirectX.Direct3DX
1.0.2903.0
v1.1.4322
Microsoft.DirectX.Direct3DX
1.0.2904.0
v1.1.4322
Microsoft.DirectX.Direct3DX
1.0.2905.0
v1.1.4322
Microsoft.DirectX.Direct3DX
1.0.2906.0
v1.1.4322
Microsoft.DirectX.Direct3DX
1.0.2907.0
v1.1.4322
Microsoft.DirectX.Direct3DX
1.0.2908.0
v1.1.4322
Microsoft.DirectX.Direct3DX
1.0.2909.0
v1.1.4322
Microsoft.DirectX.Direct3DX
1.0.2910.0
v1.1.4322
Microsoft.DirectX.Direct3DX
1.0.2911.0
v1.1.4322
Microsoft.DirectX.DirectDraw
1.0.2902.0
v1.1.4322
Microsoft.DirectX.DirectInput
1.0.2902.0
v1.1.4322
Microsoft.DirectX.DirectPlay
1.0.2902.0
v1.1.4322
Microsoft.DirectX.DirectSound
1.0.2902.0
v1.1.4322
MDX 1.1としてリリースされたMDXアセンブリの一覧(DirectX SDK August 2006に含まれるもの)

 なお、MDX 1.1は.NET Framework 2.0アプリケーションから呼び出しても問題はないと、公式にアナウンスされている。

 ただしVisual Studioでデバッグ実行を開始したときに、LoaderLock例外が発生することがある。この例外は、Managed Debugging Assistants(MDA)の実行時チェックの一種で、ローダー・ロック(LoaderLock)を保持するスレッドでマネージ・コードの実行が検出された際に発生する。

 この問題は、MDX 1.1がManaged C++による混合C++アセンブリであることに起因しており、Visual C++ 2005を使用しているMDX 2.0ベータやXNA Frameworkベータでは発生しない。また、デバッグ実行しなければ、MDAは有効にならないため、この例外は発生しない。

 以下のように、Visual Studioの[例外]ダイアログ・ボックスからLoaderLockの項目のチェックを外すことで、デバッグ実行時にこの例外で停止するのを回避することができる。

デバッグ時のLoaderLock例外の発生を回避する方法
Visual StudioのIDEのメインメニューから[デバッグ]−[例外]を選び、[例外]ダイアログ・ボックスを表示したところ。Managed Debugging Assistantsのツリーを展開し、LoaderLockのチェックを外すことで、デバッグ実行時にもアプリケーションは停止しなくなる。

 また、Direct3DおよびD3DXには64bit版(x86-64版)が存在するが、MDXで提供されるアセンブリはすべて32bit版である。そのため、MDXを使用するアプリケーションは明示的に32bit(x86版)で初期化されるようにしておく必要がある。64bitプロセスとして初期化されたアプリケーションからMDXアセンブリが呼び出されると、BadImageException例外が発生する。

 なお、MDX 1.1は今後もセキュリティ・フィックスなどのサポートは続けられるとのことだ。一方、「XNA Frameworkへのマイグレーション・ガイドのベータ版」も公開されているので、MDXからXNA Frameworkへの移行を考えている方はそれが参考になるだろう。

 MDXの欠点として、以前はランタイム・ライブラリのデプロイに関する問題が指摘されていたが、これについてはほぼ収束しつつある(後述の「コラム:DirectXランタイム・ライブラリの再配布」を参照のこと)。

自前のラッパー・ライブラリ

 「コラム:MDX/XNAは魔法か?」で述べたように、C++/CLIなどを利用して自分でラッパー・ライブラリを作成したり、DLL化してP/Invoke経由で利用したりという方法も可能である。この方法であれば、ランタイム・ライブラリの再配布の問題や、マイクロソフトがいつリリースするかといった問題に頭を悩ます必要がなく、状況によっては非常に良い選択肢になるのではないかと思う。

 特に、ネイティブDirectXを使用した描画エンジンやサウンド・システムをすでに構築している人は、使い慣れたライブラリを使用した段階的な移行を検討してみてもよいだろう。

まとめ:どの技術を採用すべきか?

 生産性に重点を置き、動きのあるアプリケーションを簡単に作成することを重視するのであれば、ツール、書籍、資料などの点で、WPFが群を抜いている。また、豊富なGUIコンポーネントやビデオ再生機能にウエイトを置く場合も、WPFは良い選択だろう。

 DirectInputやDirectSoundなどの、レガシーなDirectXを.NET言語から使用したい場合は、MDX 1.1が適している。これらのコンポーネントはXNA Frameworkではサポートされない。

 一方で、すでに、ある程度のアンマネージ・コード資産がある場合は、それを有効活用することもできる。比較的短期間で、確実に移行を行いたい場合は、既存のコード資産をC++/CLIで再利用したり、DLL化してP/Invoke経由で使用したりする方法が優れている。

 これらの条件に該当せず、Xbox 360とのクロス・プラットフォーム開発を重視する場合や、これから新しくプロジェクトを始めるという場合は、XNA Frameworkの使用をぜひ検討してみていただきたい。

【コラム】DirectXランタイム・ライブラリの再配布

 DirectXを使用したアプリケーションを実行するには、エンド・ユーザー環境にもDirectXランタイム・ライブラリがインストールされている必要がある。そのため、アプリケーションを配布する場合には、Webなどでの配布では「DirectX 9.0cが必要です」と断り書きをしたり、パッケージ販売ではDirectXランタイム・ライブラリの再配布可能ファイルを同梱したりといった方法が取られてきた。

 この方式に問題が生じ始めたのは、著作権がマイクロソフトにあるDLL型のミドルウェア(例えばMDXやD3DX DLLなど)への依存度が高まってきたことと関係している。これらのDLLは、DirectX 9.0ランタイム・ライブラリに後から追加される形で登場したため、「DirectX 9.0cのコア・ランタイムがすでにインストールされているのに、MDXやD3DX DLLはインストールされていない」という状況が起き得ることとなってしまった。単純に「DirectX 9.0cが必要です」では、済まなくなってしまったのだ。

 事態をややこしくしたのは、次のような要因もあった。

  • Windows UpdateMicrosoft Updateではこれらの追加ランタイム・ライブラリが配布されなかった
  • 当初これらの追加コンポーネントはDirectX 9.0cなどのコア・ランタイムとセットでの再配布を求められていたため、合計ファイルサイズが数十Mbytesになってしまい、Webでの配布を意図していた人々から不満を持たれていた

 ただし、現在では、これらの問題はある程度収束に向かっている。

 前者については、「DirectX Webインストーラ」の対応により、実行環境に足りない追加コンポーネントのみをダウンロードして、差分インストールできるようになった。

 なお、DirectX Webインストーラ自体は再配布が許可されていないので、ユーザーにダウンロードして実行してもらう必要がある。この方法でランタイム・ライブラリをインストールしてもらう場合は、次のダウンロード・ページにユーザーを誘導すればよい。

Microsoftダウンロード センター:DirectX End-User Runtimes (December 2005) Web Installer - 日本語

 後者の再配布ファイルサイズの問題については、再配布条件が見直され、現在では追加のランタイム・ライブラリのみを再配布したい場合のデータ・サイズを最小限に抑えられるようになっている。

 次の表は、DirectX SDK August 2006に含まれる再配布可能ファイルのリストである。ターゲットとする環境にDirectX 9.0cコア・ランタイムがインストールされていることを前提とすれば、再配布ファイルは必須の5つ(圧縮後約400 Kbytes)と依存するコンポーネントのみで済む。

ファイル名 サイズ
(Kbytes)
再配布 注意事項
dxsetup.exe
473 KB
必須
dsetup32.dll
2196 KB
必須
dsetup.dll
73 KB
必須
dxupdate.cab
80 KB
必須
dxdllreg_x86.cab
41 KB
必須
directx.cab
15130 KB
オプション
Windows 9x用DirectX 9.0c サポート
dxnt.cab
12954 KB
オプション
Windows 2000以降用DirectX 9.0c サポート
bda.cab
687 KB
オプション
Windows 9x用BDAサポート
bdaxp.cab
953 KB
オプション
Windows XP用BDAサポート(これより後のOSでは不要)
bdant.cab
1129 KB
オプション
Windows 2000用BDAサポート
[M][Y]_XACT_[A].cab
オプション
XACTランタイム・ライブラリ
[M][Y]_xinput_[A].cab
オプション
XInputランタイム・ライブラリ
[M][Y]_d3dx9_[N]_[A].cab
オプション
D3DX DLL
Apr2006_MDX1_x86.cab
896 KB
オプション
MDX 1.1ランタイム・ライブラリ(最新版のみ)
Apr2006_MDX1_x86_Archive.cab
4066 KB
オプション
MDX 1.1ランタイム・ライブラリ(すべて)
DirectXランタイム・ライブラリの再配布可能ファイル一覧(DirectX SDK August 2006に含まれるもの)
赤色のファイルは必ず含めなければならない。これら5つのファイルをZIP圧縮すると、約400Kbytesになる。
黄色のファイルは、DirectX 9.0cのコア・ランタイム・ライブラリである。Windows XP SP2、Windows Server 2003 SP1、Windows XP Professional x64 Editionをターゲットとする場合、DirectX 9.0cランタイム・ライブラリはすでにインストールされているので、これらのファイルは再配布する必要がない。以前はこの5つのファイルすべてを再配布ファイルから省略できなかったため、合計サイズが非常に大きくなってしまっていた。なお、BDAはBroadcast Driver Architectureの略である。
緑色のファイルは、追加のランタイム・ライブラリで、これらの技術に依存したアプリケーションを動かすために必要になる。[M]にはFeb、Aprといった月名が、[Y]には2005、2006といった年が入り、DirectX SDKのリリース名と対応している。また、[N]はSDKの通し番号で、24、25、……と増えている。[A]はプロセッサ・アーキテクチャを表し、x86とx64が存在する。これらのファイルの中から、アプリケーションで使用したランタイム・ライブラリを選んで再配布する必要がある。例えば実行時にD3DX DLLが見つからないと、「KB910813 You may receive a "The file d3dx9_XX.DLL was not found" error message when you try to start a Microsoft game」のようなトラブルが発生することになる。

 なお、現時点でリリースされているXNA Game Studio Expressベータ版には再配布可能なXNA Frameworkランタイム・ライブラリは付属していない。そのため、XNA Game Studio Expressベータ版を用いて作成されたアプリケーションを実行するには、その環境にもXNA Game Studio Expressベータ版の実行環境が必要になる、とのことだ。

 

 INDEX
  .NET&Windows Vistaへ広がるDirectXの世界
  第3回 .NET開発者のためのDirectX連携手法
    1.XNAとは
  2.どの技術を採用すべきか?
    3.XNA開発を始めようという方へ
 
インデックス・ページヘ  「.NET&Windows Vistaへ広がるDirectXの世界」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間