15

たとえば、Fallout 3では、セーブゲームはゲーム内のすべてのオブジェクトとNPCの状態と場所を保存し、数MBしか使用しません。彼らはどうやってそれをするのですか!?!?

そして、ゲームのプレイ中に、このデータをメモリに追加/メモリから取得して、プレーヤーにリアルタイムで表示できるようにするにはどうすればよいですか?

更新:(私はあなたにあなたの答えのために働かせるつもりです:P)

Kevin Crowellの答えに基づいています...つまり、オブジェクトとNPCに適用されるレンダリング距離があり、指定された範囲内のオブジェクトとNPCを「選択」することになると思います。ただし、これらのオブジェクトを取得するためにどのタイプのデータストアを使用しますか?

言い換えると、ゲーム内のすべてのオブジェクトの巨大な配列があり、レンダリングする可視オブジェクトを保持する小さなリストを常に更新しますか?

また、カオスの答えによると...ゲーム内のすべてのオブジェクトに最終的に触れた場合はどうなるでしょうか?あなたのセーブゲームはどんどん大きくなりますか?フォールアウト3の場合、過去のデータをドロップするだけの「ステージ」はないと確信しています。ある場所を離れたり戻ったりしても、すべてが持続します。では、この特定のケースはどのように実装されていると思いますか?

4

9 に答える 9

12

今日の大きなハード ディスクでは、開発者でさえ、1 メガバイトが何バイトであるかを忘れているようです。タイトルの質問に答えると、ゲームは数メガバイトのセーブゲームを作成することで大量のデータを保存します。

1 メガバイトの大きさを説明すると、800 万ビットです。これは、2^8000000 = 10^2666666 ステートをエンコードするのに十分です。それに比べて、宇宙には 10^80 個の原子しかありません。(セーブ)ゲームには、異なる状態を持つ複数のサブシステムがあります。たとえば、RPG では、各 NPC が独自の状態を持っています。しかし、実際にはどの程度の状態があるのでしょうか? 町での彼らの位置は 16 ビットとして保存される場合があります (とにかく歩き回っている場合、正確な位置を覚えていますか?)。彼らの気分/気質/その他は別の8ビットであり、それは一部の人々が持つよりも多くの感情を可能にします.

この種のデータをゲーム内に格納する場合、典型的なデータ構造は QuadTree です。これは、特定の XY 領域内のオブジェクトを O(log N) で決定できるデータ構造です。場合によっては、ゲーム開発者は、ワールドを事前にゾーンに分割する方が簡単であることに気付きます。これにより、実行時の計算量が削減されます。良い例はドゥームでした。その地図には可視性が事前に計算されていました。各ポイントについて、それがどのゾーンに属しているかをすばやく判断でき、各ゾーンの可視オブジェクトの量が事前に計算されました。これにより、実行時の可視​​性チェックが必要なオブジェクトの量が減少しました。

于 2009-03-31T07:55:39.587 に答える
9

オブジェクトまたはNPCをX、Y、Z座標平面にマッピングするだけです。安く保存されているその情報。

ゲームプレイ中、これらのオブジェクトはすべて常に座標系にマッピングされます。保存情報を読み込んで、そこから開始するだけです。

于 2009-03-30T18:47:38.767 に答える
8

保存/取得されるものの複雑さを過大評価していると思います。オブジェクトの 3D モデルやそのテクスチャ、またはゲームのディスク上のサイズの大部分を構成するものを保存する必要はありません。

まず第一に、chaos が述べたように、移動されたものに関する情報のみを保存する必要があります。それでも、おそらく、それらのそれぞれについて、新しい位置と向きを保存するだけで済みます (「破損」などの他の変数が含まれていないと仮定します)。つまり、オブジェクトごとに 2 つのベクトルがあり、オブジェクトごとに合計約 24 バイトになります。つまり、1 メガバイトあたり 40,000 オブジェクトの情報を格納できます。これは、非常に多くのオブジェクトが動き回ったことです。

このデータを復元することは、最初にオブジェクトを配置することほど複雑ではありません。すべてのオブジェクトは、ゲームがどこかに配置するために定義されたデフォルトの位置/方向を持っている必要があるため、デフォルトを保存ファイルに保存された値に置き換えるだけです。これは複雑ではなく、大幅な追加処理は必要ありません。

于 2009-03-30T19:07:52.553 に答える
4

特に Fallout 3 では、マップがグリッド状に分割されています。現在の正方形とすぐ隣の正方形しか見ることができません。データ ストアのタイプはそれほど重要ではありません。SQLite データベースにすることも、ディスクにシリアル化されたツリーにすることも、まったく別のものにすることもできます。

...ゲーム内のすべてのオブジェクトの巨大な配列を用意し、レンダリングする可視オブジェクトを保持する小さなリストを常に更新しますか?

通常はそうですが、「巨大な配列」はメモリ内にある必要はありません。さらにリストがあります - 現在および隣接するグリッド スクエア内のオブジェクト (背後から攻撃される可能性があります。表示されているリストにはありません)、表示されているリスト、タイマー リスト...

最終的にゲーム内のすべてのオブジェクトに触れたらどうなりますか? あなたのセーブゲームはどんどん大きくなりますか?

可能性 - すべてのデフォルトの状態テーブルがある場合、保存には違いのみを含めることができます。保存は、進行するにつれて大きくなります。

場所を離れたり戻ったりすると、すべてが保持されます。

いいえ。家の外に落とした物は、いずれ消えてしまいます。体も、おそらく。ランダムなモンスターがたまにリスポーンします。これは、ゲーム デザイナーにとって便利であると同時に、現実の世界と一致しています。

于 2009-03-31T08:28:42.160 に答える
3

保存する必要がある情報について考えると、実際にはそれほど多くはありません。

例えば

  • 位置
  • オリエンテーション
  • 在庫
  • 健康
  • 目標状態

もちろん他にもたくさんありますが、その多くはゲームの種類と保存構造の編成方法の両方に依存します。

バイオハザードのような一部のゲームでは、新しいゾーンに入ったときにのみ保存が許可されます。つまり、両方のゾーンにあるエンティティのすべての情報を保存する必要はありません。セーブを「ロード」すると、その属性はディスクから取得されます。

これがどのようにデータを取得/変更するかについては、よくわかりません。これは、コンソールのメモリ内の単なるデータです。プレーヤーが保存すると保存デバイスに書き込まれ、ロードすると復元されます。

于 2009-03-30T18:56:01.460 に答える
2

主要な手法の 1 つは差分保存です。デフォルト以外の状態のみを保存します。「ゲーム世界のすべてのオブジェクトの状態と場所を保存する」ことと、「プレイヤーが移動または変更したゲーム世界のすべてのオブジェクトの状態と場所を保存する」ことを比較対照してください。

于 2009-03-30T18:58:08.240 に答える
1

関連する注意点として、ゲームエンジンは、すべてのコンテンツのサイズを抑え、一部の操作を高速化するために、多くの場合Zip圧縮を採用しています。

于 2009-03-31T08:14:59.807 に答える
1

他のみんなが言ったことに加えて、状態は必ずしも位置と動きだけを意味するのではなく、それぞれの状態のプロパティも意味することを追加したいと思います。通常、ゲーム エンジンには、特定のクラスのデータを保存できる機能があります。

Player クラスがあり、ストーリーに夢中になっているとします。[保存] をクリックすると、保存できる可能性のあるデータは次のようになります。

  • プレイヤーは レベル/マップのどこにいますか
  • 彼の属性は何ですか : 健康、マナ、強さ、知性など
  • 彼はどんなスキルを持っていますか。
  • 彼はどのレベルですか。

グローバルには、次のものも使用できます。

  • オブジェクトへの参照(エンジンがリストからオブジェクトを選択できるようにする名前) がその特定のレベルに格納されている数、つまり、どのオブジェクトをロードするときに、どのオブジェクトを一緒にロードするか。
  • 私たちは物理学を使用していますか? もしそうなら、誰がそれを使用しますか?

などなど。Fallout 3 には 1 つのタイプのセーブがあり、別のゲームには別のタイプがあります。それは本当にジャンルと使用しているエンジンに依存します。

于 2009-03-31T08:21:16.127 に答える
1

他の回答と同様に、不要な状態データをすべて削除することが最大の節約になります。

8 ビット サイド スクローラー ゲームを見ると、画面外になるとすぐに状態を破棄し始め、多くの場合何も保持しません。これは、リソースが不足しているため、最小数以上のインスタンスを保持できないためです。

Fallout 3 のようなゲームのマクロ レベルでそれを行うことは、問題の範囲を拡大するだけの問題です。グリッドまたはその他の幾何学的方法で地形を分割し始め、プレーヤーがあるセクションから次のセクションに移動すると、スポーン/デスポーンします。メモリ内の状態が高くならないように、各領域のサイズを小さく保つことが理想的です。NPC とアイテム インスタンスを維持するために必要な最小限の状態を把握し、レイアウト データで可能な限り自動リスポーンするタグを付けて、状態を保存する必要がないようにします。

特定のデータ構造を指し示す場合、シリアライゼーション形式の例は、ポインターのツリーによってインデックス付けされた線形ストリームである可能性があります。ツリーの編成はマップ レイアウトに対応します。

于 2009-03-31T07:15:43.710 に答える