2009-05-09 18 views
12

私はそれが信じられないほど単純で、私はちょうど何かが不足していることを恐れているので、ここにこの質問への答えが表示されませんが、ここに行く。ゲームは保存されたコンテンツをどのように処理しますか?

バックグラウンドで、スキップを自由にしてください。私は数年前に飛ばした学士号のための単一のコースが必要です。理論的にはそれはコンピュータグラフィックスですが、私が残して以来、それはより多くのゲーム開発になっています。それは私にとって、それまでのような塗りつぶしのアルゴリズムや翻訳やその他のものよりも面白いからです。これは4年目のコースで、1年おきにしか提供されませんが、私は同じトピックについて4年目の独立した調査を受けさせて、十分にそれを呼び出すように、その部門に話しかけました。

独立した研究を「実行している」教授は実際のコンピュータグラフィックスコースを教えていないので、彼はスマートな人間ですが、これは実際に彼の分野ではありません。だから私の質問のほとんどは、私に教科書とインターネットに任されています。あなたが知っている...独立した研究がそうであるように。 :)

/背景

私は楽しみのためのゲームシステムを開発するのが好きバディを持っています。私は彼のテーブルトップゲームの1つをとり、それをXNAを使ってコンピュータゲームにする予定です。

私はゲームメカニックにとって克服できない挑戦は予見できませんが、私が興味を持っているのは、ほとんどのゲームがどのようにコンテンツを保存するのかです。私はいくつかの点でそれを意味し、うまくいけば私はそれらをはっきりと表現することができます。

これまでプレイしたRPGの場合を考えてみましょう。あなたは "保存"ボタンを押して、世界、あなたのキャラクターの情報、その他の必要な情報を保存することができます。その後、「ロード」ボタンを押して戻すことができます。

NPC対話の場合。マーチャント#853にぶつかると、彼は3つの異なる挨拶のうちの1つをランダムに吐き出します。

私は考えることができる他のものがありますが、それらは本当に同じテーマのバリエーションです。これらの2つの例でも、私には同じメカニックを使用することができますが、そのメカニックは何ですか?

私は何年もウェブ開発を続けてきたので、私の心は自動的に "データベース"にジャンプします。データベースは、あらゆる問題に対する解決策です。そして、私はそれがここでどのように働くか見ることができますが、オーバーヘッドはかなり急峻です。 "ここに私の6メガバイトのコンパイルされたゲームがあります...ああ、68メガバイトのMySQLインストールです。"それとも、XNAを使っているので悪いことに、SQL Serverをバンドルする方法を見つける必要があるかもしれません。 :)

おそらくXMLだと思っていましたが、それは私にも正しいと感じていません。私がXBoxを使いたければ、どうすればうまくいくのですか?またはZune? (それらは私がやっていることには必要ではありませんが、それらを考慮に入れた解決策が必要です。)

誰でも秘密を知っていますか?とにかくいくつかのアイデアがありますか?

おかげ ジェフ

答えて

6

一つのアプローチは、.NETのシリアル化を使用することです。

ゲームの状態が完全に接続されたグラフで、そのグラフの各クラスがSerializableAttributeでマークされていることを確認してください。保存すると、通常の.netシリアル化を使用できます。

Project Xenocide(オープンソースXNAゲーム)のコードベースを見れば、そのコードベースでどのように行われたかを見ることができます。

+0

ありがとうございました。私はそれを掘り下げます – JeffMc

+0

ゲームの保存画面を見て、何を起点として起きたのかを見てみましょう。 – Oded

+0

シリアライズは良い出発点ですが、テクスチャとして純粋なアセットをシリアル化したくないので、物事は厄介ですが、参照は保存して賢明な方法でリロードする必要があります。 –

0

ゲームが実行されている間、私は現在のコンテキストに関するすべてをメモリに保存しようとします。初期化は、適切なシリアライズされたフォーマットで保存し、起動時に読み込むことができます。 XMLは機能しますが、やや冗長です。カスタムコンパクトバイナリ形式がおそらくより適切です。同じことが保存された状態にも当てはまります。保存されたゲームがロードされたときに再初期化する必要があるオブジェクトはすべて、カスタムバイナリ形式にシリアル化してからロード時に再構成する必要があります。メモリの問題が発生した場合は、速度を最適化した小さなカスタムデータベースを使用することもできます。インストール時に事前に設定されている可能性があります。

5

SQLiteデータベース(SQLite.NET wrapper)を使用できます。私はこれを使用し、それは非常に簡単だとわかりました。 DLL全体はわずか850KBで、データベース自体は1つのファイルに格納されています(必要に応じて一時ファイルが作成されます)。だからあなたのユーザーは問題を持ってはいけません。

しかし、単純なXMLファイルまたは自家製バイナリ形式を使用することもできます。それは、どのようにデータを照会するのか、どのくらいのデータが関係しているかによって異なります。一つの答えはありません。

+0

これはXBoxまたはZuneでは機能しません –

+0

まず、XBoxとZuneは必要ないと彼は言いました。次に、SQLite(SQLite.NETではないかもしれないが)をXBoxで使うことができる(http://www.mail-archive.com/[email protected]/msg17898.htmlを参照)。私はZuneについて確かに知らない。 –

+1

多くのゲームは、SQLiteを使用して状態を保存します。それは私の好みの方法です。 – gradbot

1

ゲームを開発する私の限られた経験から、ゲームを保存は本当に多くのストレージを使用しないでください。 tvanfossonによると、通常ゲームをプレイしている間はほとんどのものをメモリに保存するので、ディスクに状態を保存することは問題ではありません。

ここに簡単な例があります。 1人のRPGを想定して、キャラクターの位置だけを保存する必要がある場合は、おそらくレベル番号、xyz座標、おそらくあなたが向いている方向があります。それはほんの数バイトです。

ここでは、健康パック、箱、敵、キャラクターの健康状態やアイテムを拾った状態などの状態や場所を保存する必要があると仮定します。これらは数百にものぼり、10KB未満。

複雑なゲームでは明らかに物事が複雑になることがあります。そのトリックは、プレイヤーの経験を再現するために本当に必要なものだけを保存することです。多くのゲームでは、レベルの終わりのような特定の場所でのみ保存できます。この場合、新しいレベル番号とそれ以前のレベルの結果(例えば、残りの健康状態、取り上げられたアイテム)を保存するだけです。

任意の保存ポイントを許可しても、戻れない場所/レベルの状態は無視できます。そして、あなたはおそらくユーザーが途中でジャンプを保存することを望んでいないだろう。

EDIT:ファイル形式に関して...データ型に便利な方法を使用してください。 XMLは物事を行う上で非常に良い方法です。 RPGの場合、データの各フラグメントは非常に異なる可能性があるため、データベースがどれほど効果的かはわかりません。一列に並んだテーブルの束で終わるかもしれません。

ほとんどのゲームでは、独自のバイナリ形式のファイルが使用されます。第1に、これは記憶量を劇的に減少させる。第二に、セーブゲームを手動で編集して不正行為を防ぐのに役立ちます。<health value="10"/>のようなXMLがあれば、ファイルを編集して<health value="100"/>を読むのはとても簡単です。バイナリの欠点は、デバッグがはるかに難しいことです。

+1

Fallout 3のセーブは3MBのようなものだと思います。これは私が今までに見た中で最大のものです。しかし、彼らは*すべて*を保存します。あなたが今まで殺したすべての人、そして今までに落としたすべてのアイテムは永遠にそこに座ります。他のゲームでは、体は10秒以内に消える...狂気!しかし、トピックオフ:D – mpen

+0

あなたは実際には小さなゲームのサイズを一般化することはできません。 @Markに言及されているように、Fallout 3(とOblivion、同じエンジンで動作する)のようなゲームは、実際にはたくさんのものを節約します。エンジンが効率的なストレージメカニズムを使用することが重要になります。 –

+0

しかし、3MBがゲームのために「たくさん」あるとすれば、3MBはメモリやディスクの中にまったくスペースがないので、かなり良いです。 Webブラウザのキャッシュは、このサイズの少なくとも10倍です。私が言ったように、以前のレベルに戻ることができないなどのルールを実装すると、ストレージを無駄に減らすことができます。 – DisgruntledGoat

2

他にも触れられているように、シリアライズが必要です。そして、Gamasutraはちょうどdata bakingに関する記事を発表しました。

+0

ありがとう、私はその記事を見ていきます。 – JeffMc

+0

私は間違いなく、自動シリアル化が唯一の方法だとは思わない。これは.NETフレームワークに強く制約されます(後で別のものに移植する場合はどうなりますか?)。また、冗長なデータを含む傾向があります。 –

+0

@Matthew:プラットフォーム間で互換性のあるデータフォーマットについて話しているのなら、それはもっと難しいです。しかし、それが問題ならば、.NET自体を使用することは最良のアイデアではないかもしれません。 –

8

ゲームの保存方法には、単純なものと複雑なものがあります。最初の方法は、現在のレベル、現在のスコア、およびその他の統計情報を単純に保存することです。これは、スーパーマリオギャラクシーや、以前のコンソールモジュールベースのゲームなどのゲームでも見られます。セーブゲームはあなたの正確な位置を復元するのではなく、完了したレベルだけを復元します。これらのセーブゲームは、一般に非常に単純であり、メモリはほとんど必要ありません。

2つ目の方法は、全体的な進捗状況を保存するだけでなく、敵の位置、現在のアニメーションフレームなどの細かい部分をすべて保存するため、保存ゲームをロードすると正確な場所に配置されますレベルの開始時に戻ってくるのではなく、すべての敵を適所に置いて停止した。これらのセーブゲームは、他のバージョンよりもはるかに大きくなる傾向があり、したがって、PCゲームではほとんど見られます。

データベースは、データベースの目的がデータ構造を動的にクエリする能力を提供することであるため、これらのスキームでは使用されませんが、ゲームは個々の部分を照会する方法ではなく、静的それらを保管する。セーブゲームがロードされると、それは完全にメモリにロードされ、そこからゲームエンジンがそのデータを使って処理します。データベース上で動作するMMORPGなどの例外はいくつかありますが、シングルプレイヤーゲームでは一般的にそうではありません。

実際にデータがどのように格納されるかは、ゲームによって異なります。最も一般的なものは単純なバイナリデータフォーマットのようです。なぜなら、XMLよりもディスクスペースの点ではるかに優れているからです。古いゲームでは、バイナリ形式のゲームでは、ゲームのメモリの断片の生のダンプが頻繁に発生するので、パッチやゲームの別のバージョンがリリースされたときに構造がよく分かりませんでしたゲームはまだその場合です。 XMLは他のテキストベースのファイルフォーマットと同様に使用できます。

大部分は、ゲームの保存方法が大幅に変更されたため、ゲームのデザインの問題になります。ただし、レベル数と統計情報を保存する簡単な方法は、わずか数行のコードで実装するほうがはるかに簡単です。 2番目のクラスはほとんどのクラスのシリアライズを必要としますが、複雑なゲームの場合は非常に難しい問題であり、多くの微妙なバグにつながります。

関連する問題