3

アプリケーションの複数のリソース (画像、サウンド、スクリプト、xml など) を単一/複数のバイナリ ファイルに結合して、ユーザーの手から保護するにはどうすればよいでしょうか? 一般的な手順 (整理、読み込み、暗号化など) は?

これはゲーム開発では特に一般的ですが、世の中の多くのゲーム フレームワークやエンジンでは、これを行う簡単な方法が提供されておらず、一般的なアプローチも説明されていません。私はそれを行う方法を学ぶつもりでしたが、どこから始めればよいかわかりません. 誰かが私を正しい方向に向けることができますか?

4

5 に答える 5

3

これを行う方法はたくさんあります。m_pGladiatorには、特にセラリゼーションに関して、いくつかの優れたアイデアがあります。他にもいくつかコメントをさせていただきます。

まず、大量のリソースを1つのファイルにパックする場合(私はこれらのパックファイルと呼びます)、ファイル全体をロードしてからそのファイルをメモリにデセラル化しないように作業する必要があると思います。単純な理由は、それがより多くのメモリであるということです。これはPCの場合は実際には問題ではないと思いますが、これは良い習慣であり、コンソールで作業する場合には不可欠です。m_pGladiatorが提案したように、(現在)オブジェクトをシリアル化することはありませんが、それに向かって進んでいます。

あなたが持っているかもしれないパックファイルの2つのタイプがあります。1つは、ファイルの内容に任意にアクセスしたいファイルです。2番目のタイプは、レベルをロードするときにこれらのファイルをすべて必要とするファイルのコレクションである可能性があります。基本的な例は次のとおりです。

  1. オーディオパックファイルには、ゲームのすべてのオーディオが含まれている場合があります。メニューまたはインターフェイス画面には特定の種類のオーディオをロードし、レベルにはさまざまなオーディオセットをロードするだけでよい場合があります。これは、上記の最初のカテゴリに分類される可能性があります。
  2. 2番目のカテゴリに分類されるタイプは、レベルのすべてのモデル/テクスチャなどです。基本的に、このファイルのコンテンツ全体をロード時にゲームにロードする必要があります。これは、プレーヤーがそのレベルまたはセクションをプレイしているときに、すべてのコンテンツが(おそらく)必要になるためです。

私たちが構築するパックファイルの多くは、2番目のカテゴリに分類されます。基本的に、レベルの内容をパッケージ化してから、zlibなどで圧縮します。ゲーム時にこれらのいずれかをロードするときは、少量のファイルを読み取り、読み取ったものをメモリバッファに解凍してから、ファイル全体がメモリに読み込まれるまで繰り返します。読み込んだバッファは比較的小さいですが、最終的な宛先バッファは、必要な非圧縮データの最大セットを保持するのに十分な大きさです。この方法は注意が必要ですが、RAMを節約できます。作業を開始するのは興味深い演習です。また、システムリソースの優れた管理者であるため、内部はすべて素晴らしく暖かく感じられます。packfileがdestinatinoバッファーに完全に解凍されたら、バッファーで最後のパスを実行して、ポインターの位置などを修正します。このメソッドは、パックファイルをゲームが認識している構造として書き出す場合にのみ機能します。言い換えれば、私たちのパックファイル作成ツールは、構造体(またはクラス)をゲームコードと共有します。基本的に、データ構造の正確な表現を書き出して圧縮しています。

出荷してユーザーのマシンにインストールするファイルの数を単純に減らしたい場合は、私が説明する最初の種類のパックファイルのようなものを使用できます。たぶん、あなたは何千ものテクスチャを持っていて、あなたが圧縮してパッケージ化する必要があるファイルの膨大な数を単に減らしたいだけです。基本的に一緒にパッケージ化するファイルを読み取り、ファイルとそのオフセットを含むヘッダーをパックファイルに書き込む小さなユーティリティを作成し、ファイルの内容を一度に1つずつ書き込むことができます。次々と、大きなバイナリファイルで。ゲーム時に、このパックファイルのヘッダーをロードして、ファイル名とオフセットをハッシュに保存するだけです。ファイルを読み取る必要がある場合は、ファイル名をハッシュして、パックファイルに存在するかどうかを確認できます。存在する場合は、オフセットをシークし、パックファイル内のその場所から読み取ることで、パックファイルからコンテンツを直接読み取ることができます。繰り返しになりますが、この方法は基本的に、暗号化などに関係なくデータをまとめる方法です。これは単に組織的な方法です。

しかし、繰り返しになりますが、私やm_pGladiatorが提案するようなルートを使用する場合は、ファイル全体をRAMにプルしてから、RAM内の別の場所に逆シリアル化する必要がないように努力します。それはリソースの無駄です(おそらくあなたはたくさん持っています)。これを実行して機能させることができます。機能するようになったら、一度にファイルの一部のみを読み取り、宛先バッファーに解凍するメソッドで作業できます。ただし、このように機能する圧縮スキームを使用する必要があります。zlibとlzwはどちらもそうです(私は信じています)。MD5アルゴリズムについてはよくわかりません。

これがお役に立てば幸いです。

于 2008-10-16T14:17:52.430 に答える
2

Javaとして実行:すべてをzipにパックし、ファイルシステムのようなAPIを使用してそこから直接読み取ります。

于 2008-10-15T18:44:49.427 に答える
0

簡単な答え:はい。

Mac OS 6,7,8には、この正確なタスク専用の実質的なAPIがありました。興味がある場合は、「リソースマネージャー」を検索してください。編集:ROOT物理解析パッケージもそうです。

私は今、良いツールを知っているわけではありません。どのプラットフォームで動作させたいですか?


追加するために編集:私が離れているこの種の2つまたは3つのツールはすべて、同様の構造を共有しています:

  • ファイルはヘッダーとインデックスで始まります
  • 一連のブロックがあり、その一部には独自のヘッダーとインデックスがあり、一部はリーフです。
  • 各リーフは、保存されるデータの単純なシリアル化です。
  • ファイル全体(または場合によっては個々のブロック)が圧縮される場合があります。

自分で実装するのはそれほど難しいことではありませんが、最初にあなたのニーズを満たす優れた既存のものを探します。

于 2008-10-15T18:43:08.947 に答える
0

個人的には、すでに利用可能なツールを使用してそれを行ったことはありません。ゲームが簡単にハッキングされるのを防ぎたい場合は、独自のリソース操作エンジンを開発する必要があります。

  1. まず、オブジェクトのシリアル化について読んでください。ファイル(グラフィック、サウンドなど)からリソースをロードすると、メモリ内のオブジェクトインスタンスに保存されます。ゲームは通常、数十のグラフィックオブジェクトとサウンドオブジェクトを使用します。それらすべてをロードし、メモリ内のコレクションに保存するツールを作成する必要があります。次に、それらのコレクションをバイナリファイルにシリアル化すると、そこにすべてのリソースがあります。

  2. 次に、たとえばMD5またはその他の暗号化アルゴリズムを使用して、このファイルを暗号化できます。

  3. また、zlibまたは他の圧縮ライブラリを使用して、この大きなバイナリファイルを少し小さくすることができます。

  4. ゲームでは、暗号化されたバイナリファイルをロードして解凍する必要があります。次に、それを復号化します。次に、オブジェクトコレクションを逆シリアル化すると、すべてのリソースがメモリに戻されます。

もちろん、さまざまなレベルのリソースなどをさまざまなバイナリファイルに保存することで、これをより包括的にすることができます。必要なものに応じて、さまざまなバリエーションがあります。また、最初にzipしてから暗号化するか、他の手順の組み合わせを作成することもできます。

于 2008-10-15T18:48:36.847 に答える
0

私のように、この同じトピックについて疑問に思っている将来の人々のために、次の2つのリンクをチェックしてください。

http://www.sfml-dev.org/wiki/en/tutorials/formatdat

http://archive.gamedev.net/reference/programming/features/pak/

于 2011-03-16T00:27:24.213 に答える