忍者ブログ

Memeplexes

プログラミング、3DCGとその他いろいろについて

XNA 2.0 beta

XNA Game Studio 2.0のベータ版を少し(本当に少しだけ!)使ってみました。

まずはWindows用のゲームのプロジェクトを作ってみたのですが、これはかなりわかりやすくなっている印象がありますね。

Game.Contentプロパティ

まず、画像や音、3Dモデルなどを読み込むContentManagerのインスタンスを自前で作る必要がありません
あのわけのわからないSystem.IServiceProviderを引数にとるコンストラクタを呼ばなくていいのです。
かわりに、Gameのプロパティになっています。(Game.Contentプロパティ)
ContentManager Content { get; }

おそらくContentManagerはGameクラスが管理することになったためでしょう、Content.Unloadメソッドは呼んでいる様子がありません。
きっとGame内部で呼んでいるのでしょうね。

Game.LoadContent、Game.UnloadContentメソッド

次に気付いたのはGPUを使うオブジェクトの生成と破棄をするメソッドです。
XNA 1.0ではGPUのオブジェクトの生成はGame.LoadGraphicsContentメソッド、破棄にはGame.UnloadGraphicsContentメソッドの内部で行っていたのですが、この2つのメソッドにはクセがありました。
まず両方ともどれだけ呼ばれるかプログラムを書く段階では予測が付きません。
もちろんロードとアンロードですから、必ず1回は呼ばれるわけですが、デバイスの状態によって、これがもっと呼ばれる場合だってあるのです。
ロードとアンロードなら、1回だけ呼ばれる方がわかりやすくていいはずです。

さらに、この2つのメソッドはbool型の引数を取っており、この引数の値によってメソッド内部で自前の条件分岐をしてやらなければいけません。
そうすると、どんなゲームを作るにしても、条件分岐の部分は必ず自前でやら無ければいけないのです。
つまり、条件分岐の部分がコードの重複になります。
そういった重複をなくすためのTemplate Methodパターンを使って何でまだ重複が残っているんだ!って話です。

XNA 2.0ベータではそのようなわかりにくさはなくなっています。
前述の2つのメソッドも残っていますが、GPUリソースを生成、破棄するのは新しいGame.LoadContentGame.UnloadContentメソッドをオーバーライドしたメソッド内部で行います。
protected virtual void LoadContent();
protected virtual void UnloadContent();


この2つのメソッドはゲーム中1回だけ呼ばれます。
2.0ではデバイスの仮想化が行われたそうですが、それのおかげでしょう(たぶん)。

さらに、あのわけのわからないbool型の引数も消えています。
万々歳ですね!

Game.GraphicsDeviceプロパティ

さらに、これはプロジェクトテンプレートの中には出てきませんが、GraphicsDeviceのインスタンスを取得できるGame.GraphicsDeviceプロパティも新しく追加されてます。
public GraphicsDevice GraphicsDevice { get; }


1.0ではDrawableGameComponentにはGraphicsDeviceプロパティがあるのにGameクラスの中にはGraphicsDeviceプロパティが無いというちぐはぐな感じでした。
Gameの派生クラスからGraphicsDeviceのインスタンスにアクセスするにはgraphics.GraphicsDeviceといううふうに、GraphicsDeviceManagerのインスタンスから間接的に行うのが普通だったのです。
ポリゴンを描画する時はもちろん、アルファブレンディングをオンにしたりオフにするたびにgraphics.GraphicsDevice.~です。(もちろん変数にとってやってもいいのですが、それだとスコープ内が余計な変数で汚染されるという副作用があります)
でも2.0になって、Game.GraphicsDeviceプロパティが導入されて、これでやっとシンプルな書き方が出来るようになるのではないでしょうか!


ぱっと見たくらいではこれくらいですが、実際に何かゲームを作ってみるといろいろと改良された点がわかっておもしろいかもしれませんね。




拍手[0回]

PR