これを行う方法はたくさんあります。m_pGladiatorには、特にセラリゼーションに関して、いくつかの優れたアイデアがあります。他にもいくつかコメントをさせていただきます。
まず、大量のリソースを1つのファイルにパックする場合(私はこれらのパックファイルと呼びます)、ファイル全体をロードしてからそのファイルをメモリにデセラル化しないように作業する必要があると思います。単純な理由は、それがより多くのメモリであるということです。これはPCの場合は実際には問題ではないと思いますが、これは良い習慣であり、コンソールで作業する場合には不可欠です。m_pGladiatorが提案したように、(現在)オブジェクトをシリアル化することはありませんが、それに向かって進んでいます。
あなたが持っているかもしれないパックファイルの2つのタイプがあります。1つは、ファイルの内容に任意にアクセスしたいファイルです。2番目のタイプは、レベルをロードするときにこれらのファイルをすべて必要とするファイルのコレクションである可能性があります。基本的な例は次のとおりです。
- オーディオパックファイルには、ゲームのすべてのオーディオが含まれている場合があります。メニューまたはインターフェイス画面には特定の種類のオーディオをロードし、レベルにはさまざまなオーディオセットをロードするだけでよい場合があります。これは、上記の最初のカテゴリに分類される可能性があります。
- 2番目のカテゴリに分類されるタイプは、レベルのすべてのモデル/テクスチャなどです。基本的に、このファイルのコンテンツ全体をロード時にゲームにロードする必要があります。これは、プレーヤーがそのレベルまたはセクションをプレイしているときに、すべてのコンテンツが(おそらく)必要になるためです。
私たちが構築するパックファイルの多くは、2番目のカテゴリに分類されます。基本的に、レベルの内容をパッケージ化してから、zlibなどで圧縮します。ゲーム時にこれらのいずれかをロードするときは、少量のファイルを読み取り、読み取ったものをメモリバッファに解凍してから、ファイル全体がメモリに読み込まれるまで繰り返します。読み込んだバッファは比較的小さいですが、最終的な宛先バッファは、必要な非圧縮データの最大セットを保持するのに十分な大きさです。この方法は注意が必要ですが、RAMを節約できます。作業を開始するのは興味深い演習です。また、システムリソースの優れた管理者であるため、内部はすべて素晴らしく暖かく感じられます。packfileがdestinatinoバッファーに完全に解凍されたら、バッファーで最後のパスを実行して、ポインターの位置などを修正します。このメソッドは、パックファイルをゲームが認識している構造として書き出す場合にのみ機能します。言い換えれば、私たちのパックファイル作成ツールは、構造体(またはクラス)をゲームコードと共有します。基本的に、データ構造の正確な表現を書き出して圧縮しています。
出荷してユーザーのマシンにインストールするファイルの数を単純に減らしたい場合は、私が説明する最初の種類のパックファイルのようなものを使用できます。たぶん、あなたは何千ものテクスチャを持っていて、あなたが圧縮してパッケージ化する必要があるファイルの膨大な数を単に減らしたいだけです。基本的に一緒にパッケージ化するファイルを読み取り、ファイルとそのオフセットを含むヘッダーをパックファイルに書き込む小さなユーティリティを作成し、ファイルの内容を一度に1つずつ書き込むことができます。次々と、大きなバイナリファイルで。ゲーム時に、このパックファイルのヘッダーをロードして、ファイル名とオフセットをハッシュに保存するだけです。ファイルを読み取る必要がある場合は、ファイル名をハッシュして、パックファイルに存在するかどうかを確認できます。存在する場合は、オフセットをシークし、パックファイル内のその場所から読み取ることで、パックファイルからコンテンツを直接読み取ることができます。繰り返しになりますが、この方法は基本的に、暗号化などに関係なくデータをまとめる方法です。これは単に組織的な方法です。
しかし、繰り返しになりますが、私やm_pGladiatorが提案するようなルートを使用する場合は、ファイル全体をRAMにプルしてから、RAM内の別の場所に逆シリアル化する必要がないように努力します。それはリソースの無駄です(おそらくあなたはたくさん持っています)。これを実行して機能させることができます。機能するようになったら、一度にファイルの一部のみを読み取り、宛先バッファーに解凍するメソッドで作業できます。ただし、このように機能する圧縮スキームを使用する必要があります。zlibとlzwはどちらもそうです(私は信じています)。MD5アルゴリズムについてはよくわかりません。
これがお役に立てば幸いです。