Hatena::ブログ(Diary)

ABAの日誌

Back to ABA Games
Twitter (abagames)
カレンダー
 | 

2008-01-20

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してしまい初期フレームがずれる

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

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

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

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

toritori 2008/01/20 21:19 リプレイ機能は作ったこと無いですけど、私感を。
リプレイは実行環境と同じ環境を再現することで可能なのだと思います。面倒でも単純な方法は、リプレイ機能を特殊扱いしないで一連の処理にくっつけておくのが無難だと思います。
つまり、使わなくても処理はしておくという方法になります。
冗長に感じるかもしれませんが富豪的な感じでやらないと細工的な処理が逆効果だと思います。パフォーマンス出すためにはリプレイ自体もライトな方がよいですけど、特殊扱いだとスイッチ自体がズレを生む原因になると思います。

失礼いたしました。

toritori 2008/01/20 21:46 投稿してから、発想が浮かんだので手短に。ごめんなさい。
時間に依存したカウンタを使ってはいけないと思います。
依存するべきは処理量であるのだと思います。アセンブリレベルまで考慮は無理ですけど、ネーティブなら環境の違いで同じ処理をして同じ時間で終わらなくてもそれを許容することが必要なのだと思います。
失礼しました。

hironohirono 2008/01/21 16:45 一番難しいのが処理順番の再現性を保障しなければいけない部分ですね。
例えば、スレッドAとスレッドBを使う場合にそれぞれのスレッド内部の変数の更新タイミングは保障する必要はないですが、どちらのスレッドからも扱う共通変数の更新タイミングは再現できないとリプレイバグになってしまいます。
昨今のマルチコアを有効に利用しようとして処理のスレッド化をより促進しようとする流れにある中では、この処理順番の再現性を守るような設計を行うのはなかなか難しいと思います。

TalosTalos 2008/01/21 18:59 入力を記録してリプレイするのが間違いなのかも。表示直前の各オブジェクトの位置などを記録してそれを再生する形にすれば、フレームずれなどは起こらないはず。
リプレイデータはえらい太ることになるけれど。

toritori 2008/01/21 21:22 スレッドやめてコルーチンにするとかじゃ、すり替えになっちゃうかな?
スレッド自体がゲーム性に作用しているかがネックかな?
自己診断による統計をキューイングしていくとか、ちょっと過負荷かな?
最適化とプログラマ自身の製作の容易さとのトレードオフな気がしてきました。
リプレイとは談合なのかな。
入力を記録する場合はカウンタの依存性が重要なんだと思います。ゲームロジックに1個カウンタを含めておくのが私的に落とし所なきがする。1ターンにできることを限るのも効果的かもしれません。

うん。やはり、自分にはここらへんが限界みたいですね。失礼しました。

通りすがり通りすがり 2008/01/22 08:03 とりあえずゲームのロジック部分と描画部分は完全に独立させないといけません。言うのは簡単ですが。

必要なノウハウはfps等でネット対戦を同期させるのとあまり変わらないのでそっち方面を調べるといいかもしれません。

__ 2008/01/24 03:38 XBOX360上では結局のところエミュレートしているのでしょうか?
MacとWindowsではメモリの管理方法が違うらしいし。
Winの10 5fが5f 10っていう風になるし。

通りすがり通りすがり 2008/01/25 02:20 > 10 5fが5f 10

それただのエンディアン…最近のIntel Macだと同じだし。

出水出水 2008/01/25 02:54 以前01stepの(さ)さんが書かれていましたが、floatの計算違いがあるみたいです
DirectXの座標がfloatになっているのでfloatで処理したいですけど、
最適化オプションをつけるとずれてしまうとか…
結局float厳禁って感じになっちゃうんでしょうかね

__ 2008/01/25 09:12 だが奴の源流はPowerPCだ

エンディアン自体はいろいろな意味でどっちでもいいものなのか?

testtest 2008/01/26 14:01 ムービー撮るのが早いと思うよ

 | 
旧AbaPage Diary Logs
Back to ABA Games