SQLデータベースを使用してデスクトップゲームにデータを格納する必要がありますか?[閉まっている]


9

ゲームエンジンの開発

コンピュータゲームとそのエンジンを計画しています。一人称視点の3次元の世界があり、現時点ではシングルプレーヤーになります。プログラミング言語はC ++で、OpenGLを使用しています。

データ中心の設計決定

私の設計上の決定は、グローバルイベントマネージャーとグローバルデータマネージャーがあるデータ中心型アーキテクチャを使用することです。物理、入力、サウンド、レンダラー、aiなどの多くのコンポーネントがあります。各コンポーネントは、イベントをトリガーしてリッスンできます。さらに、各コンポーネントはデータの読み取り、編集、作成、削除を行うことができます

問題はデータマネージャーについてです。

リレーショナルデータベースを使用するかどうか

SQLiteやMySQLなどのSQLデータベースを使用してゲームデータを保存する必要がありますか?これには、アイテム、キャラクター、インベントリなどの実質的にすべてのゲームコンテンツが含まれます。さらにパフォーマンスに関連するメッシュとテクスチャを除いて、メモリに保持します。

SQLデータベースは、動くキャラクターの位置などのゲーム情報をリアルタイムで読み書きするのに十分な速度ですか?また、プラットフォーム間の互換性にも注意する必要があります。すべてをメモリに保持する以外に、どのような代替手段がありますか?

利点は

MySQLのようなリレーショナルデータベースを使用する利点は、高速な計算を可能にするデータ指向の構造です。エンティティを表すためのオブジェクトは必要ありません。レンダリングに必要なプレーヤーの近くのオブジェクトのデータを簡単にクエリできました。そして、遠くにあるオブジェクトのデータを気にする必要はありません。さらに、ホールゲームの状態はデータベースに保存されるため、savegamesは必要ありません。最後に重要なことですが、ホールゲームの状態が格納されている場所が既にあるため、ゲームをオンラインゲームに拡張することは比較的簡単です。


リレーショナルデータベースよりもオブジェクトデータベースを検討することをお勧めします。これにより、脆弱なスキーマなどに関する承認された回答で言及されている問題のいくつかが解決されます。
ashes999

リレーショナルデータベースにより適したプロセスがある場合は、ハイブリッドメモリアクセスで埋め込みSQLを使用できます。これにより、従来のSQLデータベースがゲームのパフォーマンス要求に適さなくなる多くの問題が回避されます。
rovyko

回答:


11

SQLデータベースは、ゲーム情報をリアルタイムで読み書きするのに十分な速度ではありません。このようなデータは、ほとんどの場合、従来のデータ構造でメモリに保持されます。

SQLiteなどの埋め込みデータベースを特定のタイプのデータに使用することには、いくつかの利点があります。ゲームプレイ中には変化しないが、開発中には変化する静的データ。これは、ゲームを初めてロードするとき、または新しいレベルを開始するときなどにSQLiteが実際にのみ使用される最終的なゲームの一部として展開できます。

ただし、多くの欠点もあります。単一のデータベースファイルに格納されているデータの個々の部分にパッチを適用することは困難です。ゲームが必要とする(そして、ユーザーが格納すると言っていた)多くの種類の複雑なデータには理想的ではありません。外部-しかし、内部への参照や内部からの参照があります)、スキーマを変更する必要がある場合はそれほど柔軟ではありません。スキーマを変更した後など、必ずしも下位互換性があるとは限りません

これらの理由により、ほとんどのゲーム開発者は独自のフォーマットを使用します。パフォーマンスを重視するプロの開発者は、さらに一歩進んで、メモリ内のデータ構造を直接ディスクに保存するので、最小限の処理で読み込むことができます。

簡単に編集できるテキストベースの表形式のデータが本当に必要な場合は、CSV、XML、JSON、YAMLなどの単純なテキストベースの形式を使用できます。


2
ゲームの状態を保存するためにSQLiteを使用することになりました。私はエンティティシステムを使用しているので、それは完全に理にかなっています。私が持っているものはすべてプロパティです。各プロパティタイプにはデータベース内のテーブルがあり、エンティティは(グローバルで一意の)IDによってリンクされます。しかし、たとえば、継承システムのデータベースはあまり意味がないと思います。
ダニジャー2013年

1
ええ、SQLiteを使用してゲームの状態を保存することは、最初からそうすることを計画しているのであれば、良い考えだと思います。ただし、プレイ中にゲームデータが格納されるメインの場所をDBにしたくありません。
Kylotan 2014

5

データベースは高速ではありません。データベースを使用すると従来のメモリアクセスよりもはるかに遅くなります。理由は単純です。データベースは動的であり、それに付随するオーバーヘッドがたくさんあり、クエリを解析する必要があり、ハッシュを計算する必要があります。

データベースを使用することの利点は1つだけあり、それは永続性です。1つのデータベースで1つまたは複数のアプリケーションを長期間にわたって実行できます。しかし、ゲームクライアントはそれをまったく必要としません。

それで、1000px以内のすべてのオブジェクトを取得したいですか?
それは:

List<Entity> retVal;
for(entity in entities)
  if(Distance(entity.pos(), to) < 1000)
     retVal.append(entity);
return retVal;

1000px未満のすべてのオブジェクトを取得するように要求した場合、データベースはどのようになると思いますか?
まったく同じです!非常にシンプルな操作になるほどのオーバーヘッドがかかるだけで、プロセッサの時間の約100倍になります(エンティティの数によって異なります)。データベースは魔法ではありません。

サーバーアプリケーション以外にはデータベースを使用しないでください。


2
SQLサーバーには空間インデックスがあります。すべてのレコードを反復処理するのではなく、スマートインデックスアプローチを使用します
MichaelD '25
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.