読者です 読者をやめる 読者になる 読者になる

XNAいいとこわるいとこ

XNAで一個ゲームを作ってみたところでXNAにまつわる現時点での個人的な印象を書いておこう。

いいとこ

  • 開発が簡単

Visual Studioという強力な開発環境、周辺ツール、および扱いやすいC#という組み合わせのおかげでゲームを作ること自体はだいぶ簡単な印象。初期化やゲームの基本シーケンスなどはXNAフレームワークの中にうまいこと隠蔽されているので、開発者が気を使わなくてもいい。最初に戸惑ったシェーダ前提の作りも、慣れてしまえば扱いはそんなに難しくなく、HLSLを使って近代的なシェーダメカニズムで手軽に遊ぶことができる。

Windows上で開発したコードベースそのままで360上で動作させることができる。開発用PCと360がネットワーク接続さえされておけばよく、Visual Studioからのブレークポイント設定、ステップ実行、ウォッチなどのリモートデバッグも簡単に行える。360のダッシュボード上に自分のゲームが表示されてそのまま実行できるのはなかなか感慨深い。

わるいとこ

  • パフォーマンスが出ない

360のCPUが非力なのとXbox360 CLRの実装がこなれてないためにパフォーマンスを出すのが難しい。普通にコードを書くと1000程度のオブジェクトを60フレでハンドリングするのに苦労するというのは今どき厳しい。Windows上だとパフォーマンスが簡単に出てしまうのがこの問題を助長していて、Windowsではさくさく→360で動かしてなんじゃこりゃという悲劇が起こる。早めに360上で動作させてWindows上でも同程度の重さになるように意図的な処理落ちを入れる、とかしておいたほうがいいのかも。

  • 配布が難しい

出来上がったゲームを配布するのが難しい。360用バイナリを動作させるには年間9800円の開発者用メンバーシップであるXNAリエーターズクラブが必要なのでほぼ配布パスがないに等しい。Windows用も特定のランタイムを要求するために手軽には配布できない。Xbox Liveを使った配布パスを整備することはいろいろと難しいのだろうが、なんとか用意していただきたいところだ。

リプレイバグフリーは実現可能か

リプレイバグっていうのは、ゲームのリプレイ機能が正しく働かず、どこかで実際のプレイとのずれが発生してしまうバグのことだ。だいたいのリプレイ機能ってのは、記録されたユーザのパッド入力のみを再生し、あとは通常のゲームと同様の動作を行わせるっていう形で実装されるのが普通なので、その通常ゲーム動作部分が毎回同じ動作をするという保障がないと正しく動作しない。

このバグは直すのが難しい上にしばしば発生する。発生する原因をいくつか挙げると、

  • オブジェクトのフィールド初期化やオブジェクトプールのインデックス初期化が不完全でオブジェクトの振る舞いが一定しない
  • 乱数インスタンスにシードを与えるのを忘れている
  • Drawメソッドの中でカウンタなどを操作してしまいフレーム落ち時にずれる
  • リプレイ用に初期化した後に一回余計にUpdateしてしまい初期フレームがずれる

などがある。どれも発生する確率が低かったり、問題が発生した後にそれがゲームの流れに影響を与えるのがずっと後だったりするために、発見が難しい。

リプレイ実装周りのノウハウがどっかに集まっているといいんだが。

  • リプレイバグを生む原因一覧
  • それらに対処する方法
  • リプレイバグフリーなフレームワーク

あたりの情報が欲しいところだ。