WisdomSoft - for your serial experiences.

1.1 XNA Frameworkの仕組み

XNA Framework の概要と実行の仕組みを解説します。

本稿の解説は XNA Game Studio 3.0 に基づいています。最新のバージョンについては「XNA Framework」の記事を参照してください。

1.1.1 ゲームの実行基盤

XNA Framework は、Windows と Xbox 360 の両方のプラットフォーム上でゲームを実行するための基盤となるフレームワークです。XNA Framework の最大の特徴は、Xbox 360 で実行できるゲームも作れるようになったことです。高額なライセンス費用を支払って開発キットを手に入れる必要はありません。個人や小規模な組織でも、開発環境をダウンロードして、すぐにでも XNA Framework ゲーム開発を体験することができます。

一般的なソフトウェアの開発は、ソフトウェアを実行するシステムごとにコードを作らなければなりませんが、XNA Framework を使うことで、ほぼ同じコードから Windows 用のゲームと Xbox 360 用のゲームを作ることができます。これは、XNA Framework のベース技術に .NET Framework が用いられているためです。

加えて、最新の XNA Framework 3.0 からは Microsoft の携帯音楽プレイヤーである Zune でもゲームを実行できるようになりました。Zune は、本書執筆時点では北米でのみ販売されている携帯音楽プレイヤーなので、個人輸入する以外に手に入れる方法はありません。Zune 自体には日本語フォントが入っていませんが、日本語の Windows や Visual Studio から利用する点においては問題ありません。多くの日本人にとって Zune での実行は大きなメリットではありませんが、このように XNA Framework をサポートするデバイスが増えることで、簡単にゲームを移植できるようになります。将来的には、Windows Mobile などへの対応も期待されています。

XNA Framework ゲームはネイティブコードではなく、中間言語を共通言語ランタイムで実行するマネージ環境で動作します。よって、Windows や Xbox 360 といったネイティブのプラットフォームを隠蔽し、XNA Framework を通してゲームが実行されます。基本的な仕組みは .NET Framework アプリケーションと同じです。中間言語が共通言語ランタイムによって実行され、メモリはガベージコレクタによって管理されます。

図1 XNA Framework ゲームが実行される仕組み
図1 XNA Framework ゲームが実行される仕組み

ゲーム開発に興味をお持ちであれば DirectX はご存じでしょう。DirectX の登場により、ゲーム開発者はハードウェア固有の低水準なコードを書くことなく、ハードウェアの性能を引き出すことができるようになりました。DirectX は、ソフトウェアがハードウェアの機能にアクセスする橋渡し役となる API を提供し、開発者は、この API を通してハードウェアと対話できます。DirectX は、Windows 以外に Xbox や Xbox 360 でも用いられています。

.NET Framework が登場し、アプリケーションがマネージコードで書かれるようになると、マネージコードから DirectX を呼び出す Managed DirectX が登場しました。Managed DirectX は .NET Framework アプリケーションから DirectX API を呼び出す橋渡しの役目でしたが、Managed DirectX 1.1 を最後に開発は中断され、Microsoft XNA として再出発することになったのです。

XNA Framework は、DirectX の API をさらにゲームに特化させ、マネージ環境で実装したものと考えると分かりやすいかもしれません。ただし、XNA Framework は、DirectX をマネージコードでラッピングした Managed DirectX とは異なり、まったく新しく作られたゲーム開発用のフレームワークです。背景には DirectX を用いていますが、Managed DirectX と直接の関係はありません。DirectX が実装されていないプラットフォームでも、理論的には XNA Framework を実装できます。

また、.NET Framework アプリケーション開発者にとって、XNA Framework とは .NET Framework の標準クラスライブラリに加えて、ゲームに特化したクラスライブラリやツールを追加したものだと説明した方が理解しやすいかもしれません。XNA Framework は、.NET Framework をベースとしているため、ゲームの開発には NET Framework が提供する標準クラスをそのまま流用できます。ただし、Xbox 360 では .NET Framework のフルセットではなく、Xbox 360 用にカスタマイズされた .NET Compact Framework がベースとなります。

つまり、Windows PC 上で動作するゲームを作る場合は .NET Framework のすべての機能に加えて、ゲームに特化した XNA Framework のクラスなどを使って開発することになります。Xbox 360 の場合は、必要最小限の機能で構成される .NET Compact Framework に加えて XNA Framework のクラスを使って開発するということになります。同じコードから両プラットフォームのゲームを生成するには、Xbox 360 に合わせる必要があります。

1.1.2 開発環境

XNA Framework ゲームを開発するプロジェクトを作成するには、Visual C# Express Edition または Visual Studio がインストールされているコンピュータに XNA Game Studio をインストールしなければなりません。XNA Game Studio は、XNA Framework ゲームを開発するための統合開発環境で、必要な設定処理を行い、関連するツールなどをインストールします。

すばらしいことに、XNA Framework のゲーム開発には Visual Studio を使うことができます。多くの .NET Framework アプリケーション開発者にとって、使い慣れている開発環境を使って Windows ゲームはもちろん、Xbox 360 のゲームも作れるということになります。Xbox 360 でゲームを実行する方法はこの後で説明しますが、Visual Studio からネットワークを通じてゲームを配置し、デバッグすることができます。デバッグも、通常のアプリケーション開発と同じようにブレークポイントを設定し、Xbox 360 上で実行しているゲームを停止して、Windows の Visual Studio 上で変数などの状態を調べることができます。

XNA Framework ゲームの開発には、C# 言語を使います。現在、Visual Basic や C++/CLI のような他の .NET Framework 開発言語はサポートされていません。

1.1.3 パフォーマンス

XNA Framework ゲームがマネージ環境で動作するという事実は、パフォーマンスの問題を抱えていることを指定しなければなりません。近年の Java や .NET Framework の性能は、一般的なアプリケーションの範囲であれば十分実用的で、大きな障害とはなりません。しかし、ゲームやマルチメディア関連のオーサリングツールのような、ハードウェアの性能を限界まで引き出さすことが要求されるソフトウェアの開発には、今も C/C++ や DirectX が主流であることは間違いありません。

特に大きな問題となるのが、ガベージコレクションです。マネージ環境で動作する XNA Framework ゲームのコードでは、リソースがメモリから解放されるタイミングを制御することができません。システムは、メモリが不足すると自動的にガベージコレクタを起動してインスタンスの解放を行います。メモリが不足して、頻繁にガベージコレクションが発生するような状態は避けなければなりません。

ところが、ゲームの場合は、数ミリ秒単位の短い間隔で次々と画面を更新します。複雑な計算を行ってゲームデータを更新する過程で、いくつかのオブジェクトを生成することは珍しくないでしょう。こうした、描画やデータ更新のような、繰り返し実行され続ける処理の中で、無駄なインスタンス化や値型のボックス化などが発生すると、ガベージコレクタが実行される要因となりパフォーマンスを著しく落とすことになります。

このように、通常のアプリケーション開発では、さほど意識する必要のなかった微細なパフォーマンスチューニングが要求されるのは XNA Framework の特徴ではありますが、これは XNA Framework だけではなく、ゲームやリアルタイム処理の世界では珍しいことではありません。

また、パフォーマンスの問題は目的とするソフトウェアにもよります。多くの場合 Xbox 360 の LIVE アーケードで配信されているようなカジュアルなゲームであれば、XNA Framework でも開発することができます。一方で、Xbox 360 の性能を最大限に発揮させなければならない、ハイビジョンのリアルな 3D 戦争ゲームの実現は難しいでしょう。