ネイティブおよびマネージド C++ で、4 GB 以上の大きなアーカイブ ファイル(以下を参照)用のエディターを作成しています。
ファイルにアクセスするために、私は普通の人のようにファイル マッピング(下記参照) を使用しています。これはデータの読み取りには非常に優れていますが、実際にアーカイブを編集する際に問題が発生します。ファイル マッピングでは、アクセス中にファイルのサイズを変更することはできないため、ユーザーがファイルに新しいデータを挿入したい場合 (マップされたときのファイルの元のサイズを超えてしまう)、どのように処理すればよいかわかりません。
毎回全体を再マップする必要がありますか? それは遅いはずです。ただし、排他的なファイル アクセスを使用してエディターをリアルタイムに維持したいと考えています。これにより、プログラミングが大幅に簡素化され、変更中に他のアプリケーションによってファイルが台無しにされることがなくなります。私はエディタの作業に永遠を費やしたくありません。これは、私が取り組んでいる実際のプロジェクトの単純な開発ツールです。
同様のケースをどのように処理したか、また、他のアーカイブ ソフトウェア、特に他のゲームでこれを解決する方法を教えてください。
明確にするために:
これはテキスト ファイルではなく、特定のバイナリアーカイブ ファイル形式で記述しています。これは、ディレクトリ内に他の多くのファイルを含む大きなファイルを意味します。カスタム アーカイブ ファイルは、さまざまな理由から、ゲームの使用において非常に一般的です。私のフォーマットでは、Valve Software の GCF フォーマットと同様の (ただし、やや単純な) 構造を目指しています。GCF フォーマットをそのまま使用することもできますが、残念ながらこのフォーマット用のエディターは存在しません。HLLibのように、それらを読み取るため。
ゲーム リソースの保存を目的としているため、ファイルへのアクセスは高速である必要があります。したがって、データベースではありません。データベースファイルは、GFX、SFX などのファイルとともに、その中に含まれます。
ここで説明する「ファイル マッピング」は、Windows プラットフォームでの特定の手法であり、大きなファイルの一部に「ビュー」を作成することで、大きなファイルに直接アクセスできます。こちらを参照してください: http://msdn.microsoft.com/en-us /library/aa366556(VS.85).aspx - この手法により、待機時間とメモリ使用量を最小限に抑えることができ、大きなファイルに簡単にアクセスできます。したがって、これは4GB のファイル全体をメモリに読み込むという意味ではなく、まったく逆です。