ゲームクライアントのアップデーターを開発しているので、更新時にプレイヤーがクライアント全体をダウンロードする必要はありません。
さて、標準のアップデーターを作成することはそれほど難しくありませんが、大きなファイルでは非常に遅くなります。
クライアントは非圧縮で約 1.5 GB で、約 250 個のファイルがあります。更新サーバー上のファイルは gzip 圧縮されており、HTTP 経由でダウンロードされます。
アップデーターは次のように動作します: サーバーからパッチリストを取得 -> パッチリストからファイルをローカルファイル (crc32 / ファイルサイズ) と比較 -> 欠落/間違ったファイルサイズ/ハッシュが同じでない場合 -> サーバーから gzip 圧縮ファイルをダウンロード -> ファイルを解凍
アップデーターで最も時間がかかる部分: すべてのファイルの crc32 ハッシュの生成 / 大きなファイルのダウンロード
私はそれをスピードアップできるいくつかのことを考えました:
Rsync のような diff アップデーター - ファイル全体をダウンロードするだけでなく、ファイルの別の部分のみを取得するため、ダウンロードが高速化されます。通常、クライアントの更新は大きなファイルの多くの部分に影響を与えないため、これは役に立ちます。しかし、この目的のためには、ある種のやり過ぎだと思います。
より良い圧縮 - クライアントが圧縮されると、Gzip は約 200 MB を節約します。他の圧縮方法を試したことはありませんが、bzip2、lzma などを使用すると、より多くのスペースが節約され、ダウンロードが高速化されると思います。皮肉なことに、ファイルの解凍が遅くなります。
その他のファイル チェック方法 - 標準の c# md5 実装よりも高速だったので、現時点では C# crc32 実装を使用しています。ファイルが同じかどうかを判断できるより高速なアルゴリズムはありますか?
バージョン システム - 実際には何も高速化されませんが、アップデーターはすべてのハッシュを計算する必要はありません。また、追加の「修復」機能を使用すると、ユーザーが必要に応じて、すべてのファイルを実際のバージョンと照合することができます。
これらのソリューションのどれを使用する必要がありますか、または代わりに使用する必要がある、リストされていないアプローチはありますか?