保存データにテキストファイルを使用する必要がありますか?


22

私の質問は、テキストファイルを使用してゲームデータを保存する必要があるかどうかです。これを行う上でいくつかの基本的な懸念があります。

  1. データを保護する方法は本当にありません。したがって、ユーザーがデータに触れた場合、ユーザーはすべてを台無しにする可能性があります。

  2. それはおそらく私のデータを保存する最も効率的な方法ではありません(それはたくさんあります)

ただし、テキストファイルを効果的に解析/書き込みする方法は知っているので、プロトタイプを作成するためには素晴らしいものでした。開発の終わり近くで顔を痛めないように、私は切り替えに何を考えるべきかを未来に見たいだけです。

テキストファイルを使用しない場合、何を使用すればよいですか?C ++と互換性のあるものが必要です。


2
(パスワード付き)のZipファイル-そこにあなたがこれを行うことができます利用可能な多くのライブラリがあり、それがディスク容量を節約する必要があります
SeanC

2
en.wikipedia.org/wiki/ROT13のような単純な暗号を適用するだけで、平均的なユーザーがファイルを編集できないようにする必要があります。とにかく、他の誰もがおそらく彼らが何をしているのか知っているでしょう。
Exilyth

1
あなた自身の方法でそれをしてください、しかし、私は私のゲームが簡単に修正できるのが好きです。
mmyers

回答:


28

今のところ、あなたはまだ始まったばかりなので、テキストファイルはおそらく大丈夫です。あなたの質問には、私が対処するいくつかの懸念事項があります。

  1. データを保護することは、おそらく思っているほど重要ではありません。ゲームがマルチプレイヤーの場合、データはサーバー側に保存されます。ゲームがシングルプレーヤーの場合、プレーヤーがデータを変更するとどうなりますか?彼らが何かを壊した場合、それは本当に彼らのせいであり、彼らは再インストールすることができます。

  2. パフォーマンスも、適切に計画できないことが多いものです。パフォーマンスの問題を実際に測定するまで、実際に最適化すべきではありません。私の推測では、あなたはおそらくないデータの量があるでしょうということであることを大きく、そのテキストファイルがうまくあることを行っているが。

そうは言っても、最善の策は、データの保存と読み込みのルーチンを可能な限り抽象化することです。たとえば、という基本クラスを作成してDataWriter、さまざまなメソッドのさまざまな実装を提供できます。非常に基本的な例は次のようになります。

class DataWriter {
  virtual void save(GameState state) = 0;

  virtual ~DataWriter() { }
};

class TextFileDataWriter : public DataWriter {
  virtual void save(GameState state) {
    //write to text file
  }
};

class DatabaseDataWriter : public DataWriter {
  virtual void save(GameState state) {
    //write to database
  }
};

最終的にゲームのプロファイルを作成し、パフォーマンスのボトルネックがファイル書き込みルーチンにあることに気付いたら、呼び出しコードへの最小限の変更でそのクラスの別の実装を提供できます(たとえば、データベースに書き込む)。


それはシングルプレイヤーゲームであり、それらがデータをいじりたいと思っていたなら、それらはまさに私の考えでした。私は知らない、テキストファイルについて何かが専門家ではないように思えたので、ユーザーが動けなくなるのを防ぐことができるかどうかを考えました。また、「データベース」と言うときはどういう意味ですか?私は多くのことを投げかけていると聞きますが、正確な定義やどのようなファイルが必要かについてはわかりません。
アルテゼル

6
@Althezel大切なのは、データの保存方法に関係なく、データを修正するのに十分な人ができると判断したことです。その意味では、通常、保護を導入しようとすることは貴重な開発時間の無駄です:)
pwny

@Althezelデータベースに関しては、データを読み書きする要求を渡す一種のエンジンと考えてください。そのエンジンは、通常はテーブルのリレーショナル形式で、効率的な方法で保存/読み取りを行います。あなたのユースケースでは、SQLite(sqlite.org)を見てみましょう。基本的には、C ++ライブラリを使用してローカルSQLiteデータベースに接続し(SQLiteはローカルファイルを使用)、そのライブラリ呼び出しをSQL構文で渡してデータにアクセスします。
pwny

2
開発者がコンピューターに保存されている情報からユーザーをロックアウトできるようにしたいのは悲しい世界です。
ClassicThunder

2
"save-data.txt"として保存するゲームはほとんどないため、テキストファイルを使用するのはあまりプロフェッショナルではありませんが、保存されたほとんどのゲームファイルを調べてみると、多くの場合テキストファイルにすぎません。バイナリデータが追加されることがあります。たとえば、すべてのCivilization and Total Warシリーズのゲームは、さまざまなゲームデータに実際の.txtファイルを使用します。このための最も一般的な「アップグレード」は、データをフラットファイルとして保存するデータベースシステムです。これは、一部のバイナリBLOBを除き、単なるテキストファイルです。
ブライアン

3

ゲームデータという言葉は、たとえば

  • Gamestate
  • 構成ファイル
  • マップ、テクスチャ、サウンド、スクリプト、アニメーションデータ、...
  • ローカリゼーション
  • GUIレイアウトデータ
  • もっと考えなかった

カテゴリごとに、別のアプローチを取ることができます。

たとえば、SQLiteを使用できます、ローカライズに、マップにバイナリ、テクスチャ、サウンドなどを。

設定に関しては、簡単に変更できるxmlファイルを使用する必要があります。

いつものように、正しい答えは「依存する」です。

c ++バインディングを持つ多くのxmlパーサーが存在し、SQLiteのc ++バインディングも存在します。


それは宗教的なことかもしれませんが、XMLではなくINIファイル形式を構成に使用したいです。後者は、このシナリオではやり過ぎのように感じます。また、ブーストライブラリにはINIリーダーがあります。
アルトゥールツァイカ

0

データをバイナリblobとして保存し、そのファイルにアクセスするときにデータをストリーミングして戻すことができます。これにより、両方の問題が解決します。シリアル化コードが逆シリアル化とまったく同じであることを確認してください。

バイナリBLOBのストリーミングは比較的高速であり、ユーザーがデータを見たり変更したりすることも防ぎます。

標準ライブラリストリームを使用して、これらすべてを実現できます。


2
バイナリblobは高速で簡単です(開発とロード/実行の両方)バイナリblobで私が抱えていた最大の問題は、データ構造の構成について何かを変更するとすぐに(単一のfloatメンバーを単一のメンバーに追加するほど)オブジェクト)、古いセーブゲームは完全に無効になります。これは開発中に対処するのは困難ですが、それを実行するのであれば、どうしても必要です。
ボボボボ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.