Я разрабатываю обновление для игрового клиента, так что игрокам не придется загружать весь клиент, когда он будет обновлен.
Теперь создание стандартного обновления не очень сложно, но оно довольно медленное с большими файлами.
Клиент составляет около 1,5 ГБ несжатого и имеет ~ 250 файлов. Файлы на сервере обновлений gzip-сжаты и загружаются через HTTP.
Программа обновления работает следующим образом: получить список патчей с сервера → сравнить файлы из списка патчей с локальными файлами (crc32/filesize) → если отсутствует/неправильный файлize/hash - это не то же самое → скачать gzip сжатый файл с сервера → распаковать файл
Самые трудоемкие части обновления: генерирование хэшей crc32 для каждого файла/загрузка больших файлов
Я подумал о некоторых вещах, которые могли бы ускорить его:
-
Rsync-like diff updater - это ускорит загрузку, поскольку оно будет получать только часть файла, а не просто загружать весь файл. Это было бы полезно, потому что обычно обновление клиента не влияет на многие части больших файлов. Но я предполагаю, что для этого будет какой-то перебор.
-
Улучшение сжатия - Gzip экономит около ~ 200 МБ, когда клиент сжат. Я не пробовал использовать некоторые другие методы сжатия, но я предполагаю, что bzip2, lzma или еще сэкономит больше места и ускорит загрузку. По иронии судьбы они замедляли декомпрессию файлов.
-
Другой метод проверки файлов. На данный момент я использую реализацию С# crc32, потому что она была быстрее, чем стандартная реализация С# md5. Есть ли более быстрые алгоритмы, которые могут определить, является ли файл одинаковым?
-
Система версий - на самом деле это ничего не ускорит, но программа обновления не должна будет вычислять все хэши. И с дополнительной "ремонтной" -функцией он может просто проверять все файлы против фактической версии, если пользователь хочет.
Какое из этих решений я должен использовать или есть какие-либо подходы, которые я не перечислял, которые я должен использовать вместо этого?