11

ゲームクライアントのアップデーターを開発しているので、更新時にプレイヤーがクライアント全体をダウンロードする必要はありません。

さて、標準のアップデーターを作成することはそれほど難しくありませんが、大きなファイルでは非常に遅くなります。

クライアントは非圧縮で約 1.5 GB で、約 250 個のファイルがあります。更新サーバー上のファイルは gzip 圧縮されており、HTTP 経由でダウンロードされます。

アップデーターは次のように動作します: サーバーからパッチリストを取得 -> パッチリストからファイルをローカルファイル (crc32 / ファイルサイズ) と比較 -> 欠落/間違ったファイルサイズ/ハッシュが同じでない場合 -> サーバーから gzip 圧縮ファイルをダウンロード -> ファイルを解凍

アップデーターで最も時間がかかる部分: すべてのファイルの crc32 ハッシュの生成 / 大きなファイルのダウンロード

私はそれをスピードアップできるいくつかのことを考えました:

  • Rsync のような diff アップデーター - ファイル全体をダウンロードするだけでなく、ファイルの別の部分のみを取得するため、ダウンロードが高速化されます。通常、クライアントの更新は大きなファイルの多くの部分に影響を与えないため、これは役に立ちます。しかし、この目的のためには、ある種のやり過ぎだと思います。

  • より良い圧縮 - クライアントが圧縮されると、Gzip は約 200 MB を節約します。他の圧縮方法を試したことはありませんが、bzip2、lzma などを使用すると、より多くのスペースが節約され、ダウンロードが高速化されると思います。皮肉なことに、ファイルの解凍が遅くなります。

  • その他のファイル チェック方法 - 標準の c# md5 実装よりも高速だったので、現時点では C# crc32 実装を使用しています。ファイルが同じかどうかを判断できるより高速なアルゴリズムはありますか?

  • バージョン システム - 実際には何も高速化されませんが、アップデーターはすべてのハッシュを計算する必要はありません。また、追加の「修復」機能を使用すると、ユーザーが必要に応じて、すべてのファイルを実際のバージョンと照合することができます。

これらのソリューションのどれを使用する必要がありますか、または代わりに使用する必要がある、リストされていないアプローチはありますか?

4

3 に答える 3

2

個々のファイルを圧縮する

パッケージ全体をダウンロードするのではなく、新規または変更されたファイルのみをダウンロードできます。

クライアントとサーバーの両方にハッシュを保存する

ハッシュを事前に計算することで、多くの時間を節約できます。ハッシュ比較ステップは、すべてのファイルのハッシュを格納する 1 つのファイルの差分になります。これは機能的にはバージョン管理システムと同じですが、「バージョン」をだますのは少し難しいです。ユーザーはバージョンのプレーン テキスト ファイルを開き、番号を次のバージョンに設定してパッチをスキップするのは簡単です。この種の動作を防ぎたい場合は、ハッシュの方が少し安全です。

並列化

ハッシュ ファイルの差分を実行した後、ダウンロードする必要があるファイルのリストを取得するためにサーバーにリクエストを送信できます。その後、ダウンローダーは各ファイルを連続してストリーミングできます。ファイルが受信されると、追加のスレッドがダウンロードしたファイルを解凍して移動できます。

于 2013-08-23T15:12:20.393 に答える
1

もう 1 つのオプションは、完全なファイルではなく変更内容のデルタを保存することです。次に、ファイルを新しいバージョンに「アップグレード」するために必要なものだけをプルダウンします。http://xdelta.org/を調べてください

于 2013-08-23T16:01:19.137 に答える
1

私は過去にこれを行ったことがありますが、それは実際に特定の実装と必要なオプションに依存します。私たちがしたことのいくつか:

  • 毎回更新するための「フル」スキャンの設定をユーザーが選択できるようにします。セキュリティ上の懸念がない限り、すべてのハッシュを比較する理由はありません。
  • フル スキャンでは、必要に応じてプレーン テキスト ドキュメントまたは XML ドキュメントに対して最初にハッシュを実行します。XML は、必要な特定のファイルのみを取得するためのサーバーとの照合に役立つことがわかりました。
  • これがうまくいく場合は、コンテンツではなくファイルの「名前」だけでいつでもハッシュを実行できます。どういう意味ですか?Directory.GetFiles() の結果と予想される結果をハッシュして、欠落しているファイルをさらに掘り下げる必要があるかどうかを確認します。ファイルの改ざんが心配で、実際にコンテンツのハッシュが必要な場合、これは明らかに機能しません。
于 2013-08-23T15:19:40.070 に答える