Учавствую в разработке некой игры и наконец-то устали заливать новую копию игры каждый раз, учитывая что она уже весит 3+ гигов. Решили заранее сделать по крутому и сделать либо сразу лаунчер для игры, но потом быстро отступили от этой идеи и решили сделать хотя бы чисто апдейтер.
Задача:
Суть апдейтера должна быть в том что где-то на сервере/хостинге(в т.ч. виртуальном) лежат все эти 3+ гигов игры, когда выходит новая версия - ее заливают туда по FTP с заменой файлов. Когда выходит новая версия игроки могут попросту запустить апдейтер и тот проверит все файлы игры с теми что на хостинге и заменит старые на новые(но при этом не будет закачивать одинаковые).
Как я предполагаю это должно работать?
Я не знаю точно ничего про это. Полагаю нужно сделать побайтовую проверку каждого файла что бы точно знать что он старый или новый, но тогда это будет долго и будет большая нагрузка на сервер(наверное, а ведь игру будут закачивать сотни человек, и более того закачивать будут чуть ли не в день релиза обновления сразу все).
Другой вариант сравнивать размеры SHA1 или что-то вроде этого. Но что если в файле будет изменен только 1 символ, есть же какой-то шанс что этот способ пропустит какое-то изменение?
Инструменты для этого:
Я не работал с файлами еще так подробно как нужно тут. В основном я работал с веб-технологиями: PHP, JS и все что с ними связано или лежит рядом. Я почитал, их можно использовать с например WinJS, PHP-GTK или мне очень понравился PHP Desktop с его возможностями. Но это звучит как какой-то способ через заднее место. Я слабо знаком с C++ и думаю попробовать реализовать что-то такое на C#.
Но я почти уверен что ничего не нужно придумывать, где возможно уже есть готовое решение, что бы можно было создать обычный update.exe который пройдет по всем файлам и заменит нужные. Я нашел некий electron-builder который возможно сделает что-то подобное, но сперва я хотел бы услышать мнение более опытных людей на эту тему.
Приведенные выше два пукнта скорее всего не позволят вам использовать какое-то готовое решение (например lftp), особенно первый. Вам нужно писать свой загрузчик игры, который и будет проверять наличие обновлений и выполнять это обновление, предварительно остановив игру.
Что касается сравнения файлов, то я бы завел регистр версий (хешей) файлов - текстовый докумень. По нему можно было бы и судить, что нужно обновить, а что уже есть. Т.е. один текстовый файл лежит у пользователя, другой на сервере, у обоих версии файлов уже посчитаны, каждый раз вычислять ничего не нужно. При замене файла правим локальный текстовый файл, вставляя актуальные версии хешей.
Единственный минус при таком подходе в том, что если пользователь вручную удалит часть файлов, то ваш обновляетор этого не заметит, так как он опирается на текстовый файл. С другой стороны, можно дописать еще одну утилиту полной проверки файлов, которая будет считать хеш суммы файлов и проверять их с данными из локального тектового файлика.
Структура примерно такая:
/data/
/sounds/
/sound1.mp3 {sdfu9r72fv83r7wehfsed}
/sound2.mp3 {df82j0380dusoisdfsdfs}
На чем игра, на том, наверное, лучше и писать утилиту для обновления.
Не думаю, что стоит задумываться по поводу коллизий хешей файлов (разные файлы имеют один хеш), это моловероятно.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Хочу научиться писать клиент-серверные приложения, но не знаю с чего начать
В своей программе я использовал оператор == для сравнения строкНо я наткнулся на баг, и при замене == на equals он пропал