Updater для программы/игры

306
06 октября 2017, 15:13

Учавствую в разработке некой игры и наконец-то устали заливать новую копию игры каждый раз, учитывая что она уже весит 3+ гигов. Решили заранее сделать по крутому и сделать либо сразу лаунчер для игры, но потом быстро отступили от этой идеи и решили сделать хотя бы чисто апдейтер.

Задача:

Суть апдейтера должна быть в том что где-то на сервере/хостинге(в т.ч. виртуальном) лежат все эти 3+ гигов игры, когда выходит новая версия - ее заливают туда по FTP с заменой файлов. Когда выходит новая версия игроки могут попросту запустить апдейтер и тот проверит все файлы игры с теми что на хостинге и заменит старые на новые(но при этом не будет закачивать одинаковые).

Как я предполагаю это должно работать?

Я не знаю точно ничего про это. Полагаю нужно сделать побайтовую проверку каждого файла что бы точно знать что он старый или новый, но тогда это будет долго и будет большая нагрузка на сервер(наверное, а ведь игру будут закачивать сотни человек, и более того закачивать будут чуть ли не в день релиза обновления сразу все).

Другой вариант сравнивать размеры SHA1 или что-то вроде этого. Но что если в файле будет изменен только 1 символ, есть же какой-то шанс что этот способ пропустит какое-то изменение?

Инструменты для этого:

Я не работал с файлами еще так подробно как нужно тут. В основном я работал с веб-технологиями: PHP, JS и все что с ними связано или лежит рядом. Я почитал, их можно использовать с например WinJS, PHP-GTK или мне очень понравился PHP Desktop с его возможностями. Но это звучит как какой-то способ через заднее место. Я слабо знаком с C++ и думаю попробовать реализовать что-то такое на C#.

Но я почти уверен что ничего не нужно придумывать, где возможно уже есть готовое решение, что бы можно было создать обычный update.exe который пройдет по всем файлам и заменит нужные. Я нашел некий electron-builder который возможно сделает что-то подобное, но сперва я хотел бы услышать мнение более опытных людей на эту тему.

Answer 1
  1. Чтобы обновлять файлы игры, игра должна быть остановлена, чтобы не было проблем с доступом к файла.
  2. Игра весит довольно много, еще нужно знать максимальный размер файлов, это так же будет влиять на операцию сравнения файлов.

Приведенные выше два пукнта скорее всего не позволят вам использовать какое-то готовое решение (например lftp), особенно первый. Вам нужно писать свой загрузчик игры, который и будет проверять наличие обновлений и выполнять это обновление, предварительно остановив игру.

Что касается сравнения файлов, то я бы завел регистр версий (хешей) файлов - текстовый докумень. По нему можно было бы и судить, что нужно обновить, а что уже есть. Т.е. один текстовый файл лежит у пользователя, другой на сервере, у обоих версии файлов уже посчитаны, каждый раз вычислять ничего не нужно. При замене файла правим локальный текстовый файл, вставляя актуальные версии хешей.

Единственный минус при таком подходе в том, что если пользователь вручную удалит часть файлов, то ваш обновляетор этого не заметит, так как он опирается на текстовый файл. С другой стороны, можно дописать еще одну утилиту полной проверки файлов, которая будет считать хеш суммы файлов и проверять их с данными из локального тектового файлика.

Структура примерно такая:

/data/
    /sounds/
        /sound1.mp3 {sdfu9r72fv83r7wehfsed}
        /sound2.mp3 {df82j0380dusoisdfsdfs}

На чем игра, на том, наверное, лучше и писать утилиту для обновления.

Не думаю, что стоит задумываться по поводу коллизий хешей файлов (разные файлы имеют один хеш), это моловероятно.

READ ALSO
Как научиться работать с сетью в Android? [требует правки]

Как научиться работать с сетью в Android? [требует правки]

Хочу научиться писать клиент-серверные приложения, но не знаю с чего начать

246
Как сравнивать строки в Java?

Как сравнивать строки в Java?

В своей программе я использовал оператор == для сравнения строкНо я наткнулся на баг, и при замене == на equals он пропал

288
Создание и сохранение файлов Android;

Создание и сохранение файлов Android;

Как создать папку на устройстве (android/data/comblabla

298