XNAフレームワークってなに?

 

浅春のみぎり、時下ますますご清祥の段、お慶び申し上げます。毎々格別のご愛顧を賜り、厚く御礼申し上げます。

………

ダメだぁ、もう丁寧な日本語が書けない体(どんな体よ?)になってる……。個人のブログは家でまったりと、机の上で寝ているねこさん達を撫でながら好好爺然として書いていますが、このブログは会社で書いているせいかテンションが高い?ので、日本のビジネスマナーである丁寧語や美辞麗句、甘言(?)といったもの抜きでサクサクと書いていこうと思います。

 

XNAフレームワークはゲームを作るのを目的としてデザインされたマネージド・クラスライブラリ群です。DirectXも、元々はゲームを作るためのライブラリとして設計されていたのですが、現在では多岐に渡る機能を詰め込んだ変わりに、非常に複雑化してしまい、遂にはDirectXはゲームエンジン作成者の為のライブラリとまで言われることが多くなりました。

また、DirectXではゲームを実際に実行しているとき(ランタイム)に使うAPIと、ゲーム開発時(オフライン)に使われるAPIの区別が明確ではない場合があり、間違った使い方をしてしまうと、実行速度が本来出せる性能の半分以下の性能しかだせないということがあります。

例えば、ID3DXMeshは手軽にXファイルの読み込みと表示ができるという触れ込みですが、うっかりOptimizeMeshD3DXWeldVerticesといった関数を呼ぶのを忘れてしまうと、思わぬパフォーマンス低下に繋がります。

XNAチームの目標は、ゲーム製作者がプロジェクトを新規作成してから5分以内でゲームのコードが書けるということです。個人的にはこれを 「玄関開けたら、5分でゲーム製作」 と呼んでいます。

 

左図(クリックすると別ウィンドウで開きます)は、XNA Framework 1.0の構造図です。下から順に、プラットフォーム、コア・フレームワーク、拡張フレームワーク、そしてゲームといったレイヤに分かれています。

プラットフォームレイヤはPCやXbox360といったハードを効率よく使うためのネイティブな部分です。Xbox360上からは、セキュリティ上の問題からこの部分には直接アクセスできません。

その上にはXNAフレームワーク最初のレイヤであり各プラットフォームを仮想化するコア・フレームワークがあります。コア・フレームワークでは厳密にはプラットフォーム間での違いがありますが、その差は小さく、殆どの場合はPCとXbox360上で同一のコードで動作させることができます。

続いて拡張フレームワークですが、このレイヤではゲーム開発をより簡単にするための機能が提供てされています。ゲームのメインループを含むアプリケーション・モデルや、コンテント・パイプラインはここに位置します。

最後にゲーム・レイヤになりますが、ここにはゲーム製作者が作るゲームコードやコンテント、またコミュニティによって提供されるコンポーネントなどが位置しています。

 

以下に、それぞれの機能の概要を記します。

 

アプリケーション・モデル(Application Model)

ゲーム製作者がゲームを作ることに集中できる環境を提供しています。ウィンドウの初期化やメッセージハンドリング、タイマーの設定、GraphicsDeviceの初期化などをPC/Xbox360の両プラットフォームで同じ扱いができるGameクラス、コミュニティ間でコードの流用がしやすいように設計されているGameComponentなどのクラスがあります。

 

コンテント・パイプライン(Content Pipeline)

XNA独自の機能のひとつでユーザーの視点からすると、他のWindowsアプリケーション開発と同じ感覚で、テクスチャや3Dモデル、サウンドといったコンテントをプロジェクトに追加するだけでゲーム上で簡単に使えるというものです。表向きの便利さ同様に拡張性にも優れていて、独自のインポーターやプロセッサを用意することで自由にカスタマイズすることができ、PC/Xbox360の両プラットフォームで最適に動作するコンテントを容易に扱うことができます。

 

グラフィクス(Graphics)

Managed DirectX 2.0 (MDX 2.0)をベースとして、より使いやすく、.Netデザインガイドラインに則したものになりました。大きな変更点としては、固定機能パイプライン(FFP)の機能が外されました。これはFFPとシェーダーモデルでは、プログラミングモデルが大きく異なることと、Xbox360やDirectX10に見られるように将来的にシェーダーモデルが主流となると判断した結果です。

シェーダーモデルプログラミングを最初から組むのは難しいので、2D描画を簡単に行えるSpriteBatchや、3Dモデル描画用のBasicEffectModelなどのクラスが用意されています。

 

オーディオ(Audio)

XNAのオーディオサポートは、XACTというPC/Xbox360両プラットフォームに対応しているサウンドライブラリを使用しています。GSEに付属しているXACTオーサリングツールで、サウンドバンクやウェーブバンクといったパッケージを作ることができ、そのパッケージを使うことで簡単に効果音やBGMを鳴らすことができます。ウェーブデータの圧縮にはPC上では圧縮率4:1のADPCMが使え、Xbox360上ではWMAをゲーム用にカスタマイズした圧縮率が6:1~12:1のXMAが使えます。

 

 

入力(Input)

XNAではXbox360用のコントローラーと、キーボードをPC/Xbox360の両プラットフォームで使うことができ、PC上でマウスを使うことができます。イベント駆動式ではなく、フレーム毎にステートをチェックするという形式になっています。振動機能はGamePad.SetVibration関数でXbox360コントローラーの左右に内蔵されている振動用のモーターを速度を自由に変更できるようになっています。

 

数学(Math)

Vector2Vector3Vector4Matrix、そしてQuaternionと言った基本的な構造体の他にBoundingBoxBoundingFrustumBoundingFrustumRayPlaneといったプリミティブがあり簡単な衝突判定に使えるようになっています。特にBoundingFrustumはビュー、プロジェクション行列から生成することができるので、オブジェクトの可視判定に最適です。

従来のDirectXやMDXとの最大の違いとして、右手座標のみのサポートがあります。これは、コードを開発者の間で流用する時に右手左手の両方があると、余計な混乱の元になるとの判断からです。

 

ストレージ(Storage)

ゲームでのセーブデータの保存、読み込みをサポートするためのもので、PC/Xbox360の両プラットフォームで使用可能です。Xbox360上ではHDD、メモリカードのどちらにもデータを保存することができます。PC上でのセーブデータの上限はOSに依存しますが、Xbox360上では最大2GBまでのデータの保存ができます。

 

以上がXNAフレームワークの概要です。次回からは、それぞれの機能の詳細を紹介します。

 

 参照リンク
XNA Team Blog "What is the XNA Framework"
http://blogs.msdn.com/xna/archive/2006/08/25/724607.aspx