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を使った配布パスを整備することはいろいろと難しいのだろうが、なんとか用意していただきたいところだ。
リプレイバグっていうのは、ゲームのリプレイ機能が正しく働かず、どこかで実際のプレイとのずれが発生してしまうバグのことだ。だいたいのリプレイ機能ってのは、記録されたユーザのパッド入力のみを再生し、あとは通常のゲームと同様の動作を行わせるっていう形で実装されるのが普通なので、その通常ゲーム動作部分が毎回同じ動作をするという保障がないと正しく動作しない。
このバグは直すのが難しい上にしばしば発生する。発生する原因をいくつか挙げると、
などがある。どれも発生する確率が低かったり、問題が発生した後にそれがゲームの流れに影響を与えるのがずっと後だったりするために、発見が難しい。
リプレイ実装周りのノウハウがどっかに集まっているといいんだが。
あたりの情報が欲しいところだ。
リプレイは実行環境と同じ環境を再現することで可能なのだと思います。面倒でも単純な方法は、リプレイ機能を特殊扱いしないで一連の処理にくっつけておくのが無難だと思います。
つまり、使わなくても処理はしておくという方法になります。
冗長に感じるかもしれませんが富豪的な感じでやらないと細工的な処理が逆効果だと思います。パフォーマンス出すためにはリプレイ自体もライトな方がよいですけど、特殊扱いだとスイッチ自体がズレを生む原因になると思います。
失礼いたしました。
時間に依存したカウンタを使ってはいけないと思います。
依存するべきは処理量であるのだと思います。アセンブリレベルまで考慮は無理ですけど、ネーティブなら環境の違いで同じ処理をして同じ時間で終わらなくてもそれを許容することが必要なのだと思います。
失礼しました。
例えば、スレッドAとスレッドBを使う場合にそれぞれのスレッド内部の変数の更新タイミングは保障する必要はないですが、どちらのスレッドからも扱う共通変数の更新タイミングは再現できないとリプレイバグになってしまいます。
昨今のマルチコアを有効に利用しようとして処理のスレッド化をより促進しようとする流れにある中では、この処理順番の再現性を守るような設計を行うのはなかなか難しいと思います。
リプレイデータはえらい太ることになるけれど。
スレッド自体がゲーム性に作用しているかがネックかな?
自己診断による統計をキューイングしていくとか、ちょっと過負荷かな?
最適化とプログラマ自身の製作の容易さとのトレードオフな気がしてきました。
リプレイとは談合なのかな。
入力を記録する場合はカウンタの依存性が重要なんだと思います。ゲームロジックに1個カウンタを含めておくのが私的に落とし所なきがする。1ターンにできることを限るのも効果的かもしれません。
うん。やはり、自分にはここらへんが限界みたいですね。失礼しました。
必要なノウハウはfps等でネット対戦を同期させるのとあまり変わらないのでそっち方面を調べるといいかもしれません。
MacとWindowsではメモリの管理方法が違うらしいし。
Winの10 5fが5f 10っていう風になるし。
それただのエンディアン…最近のIntel Macだと同じだし。
DirectXの座標がfloatになっているのでfloatで処理したいですけど、
最適化オプションをつけるとずれてしまうとか…
結局float厳禁って感じになっちゃうんでしょうかね
エンディアン自体はいろいろな意味でどっちでもいいものなのか?