非常に大きなゲーム世界向けのストレージの設計
-
22-07-2019 - |
質問
ゲームプログラミングを再開しています。 10年前、私はqbasicでゲームを作成していましたが、ゲームプログラミングを行っていなかったので、かなりさびていました。私はずっとプログラミングをしてきましたが、今はWeb開発者/ DBA /管理者です。いくつか質問がありますが、投稿ごとに1つに制限します。
私が取り組んでいるゲームは、大きく、非常に大きな世界になるでしょう。 URW のようになりますが、さらに大きな世界などになります。 「RPG」。
私が決めようとしたのは、マップをレイアウトし、保存し、アクセスするための最良の方法です。 sqliteを使用してデータを保存するというアイデアを考えました。それから、ゲームの保存ファイルとしてsqlite dbを使用することもできます。
誰がこれについてどうやってやるべきか、他のストレージ方法のアイデアについて何かアドバイスがありますか?
ゲームの要件は次のとおりです。
- ゲームワールドのスポットに完全にランダムアクセスする必要があります(NPC、モンスター、動物は常にアクティブになります)。
- Stackless Python 3.1を使用しています。多くの作業をしない限り、オプションはかなり制限されています。
- 非常に大きな世界を処理できるようにする必要があります。
- 同時実行性のサポートはプラスになりますが、必要になるとは思いません。
解決
外部要因によってリレーショナルデータベースを使用せざるを得ない限り、リレーショナルデータベースを混乱させないでください。
Pythonの pickle
、 shelve をご覧ください。
Shelveは高速で拡張性に優れています。 Python表現と非Python表現の間の乱雑な変換を排除します。
編集。
より重要なアドバイス。技術の選択に困惑しないでください。場所、アイテム、キャラクター、ルールなどを取得して、仕事します。 Pythonで。できるだけ簡単かつ正確に。
コアモデル、正確性、および物事を証明するための基本的な機能セット以外に、単一の脳カロリーを消費しないでください。
。
実際に動作するモデルができたら、 、高度な単体テストを実行してから、技術を選択できます。
モデルを作成したら、意味のある数百万の場所に拡張して、必要なストレージの種類を確認できます。モデルを変更することはできません-それはアプリケーションの本質です。パフォーマンスを調整するために変更できるのは、アクセスレイヤーと永続レイヤーのみです。
他のヒント
求めているのは、空間インデックスのタイプのようです。非常に大きな2Dゲームの場合、 quadtree を使用することをお勧めします。 Quadtreeは、大きなエリアがあり、そのエリアのローカライズされた領域でアクティビティが発生する傾向がある場合にうまく機能します。これは、ほとんどのRPGタイプのゲームの場合です。ストレージ要件を低く抑え、できれば衝突検出も高速化します。
ゲームを保存する場合、プレイヤーやモンスターの統計などは、頻繁に変更されるのではないかと心配している場合、データベースに登録できます。実際のレベルレイアウトには、ゲーム固有のバイナリファイル形式を使用することをお勧めします。通常、レベルレイアウトで実行する必要があるデータベースタイプのクエリは多くありません。独自の形式を使用して最適化を行うことができます。データベースにクアッドツリーのような形式の格納を開始する方法がわかりません(可能性は確かですが)。
大量のデータを保存するために非リレーショナルデータベースを使用しています。 64ビットのハードウェアで作業できる場合は、 MongoDB と Pythonドライバーは非常に優れています。これがStacklessで大丈夫かどうかはわかりませんが、可能性はあります。