reus - TrueCat17/Ren-Engine GitHub Wiki
В Ren-Engine есть система обновлений.
Эта система не делает вообще ничего без прямого указания пользователя:
- Нет автоматических проверок (вышло ли новое обновление?);
- Нет уведомлений (обновление вышло, не хотите ли скачать?);
- Нет автоматического обновления;
- Есть дополнительное подтверждение с указанием размера файлов, требующих скачивания.
Всё это не только является уважением к пользователю, но также дополнительно повышает безопасность и уменьшает расход интернет-трафика.
Ещё несколько плюсов:
- Пользователю не нужно скачивать полный архив проекта - только изменённые файлы;
- Пользователь не может по ошибке распаковать архив в старую папку, тем самым оставляя старые файлы, если они были удалены в новой версии (что, очевидно, может сломать игру).
Для использования системы обновлений нужно лишь поместить простой текстовый файл upd_link.txt
со ссылкой на сервер в корневую папку игры (в которой находятся resources
и var
) или в папку мода
(на самом деле, можно в любую папку игры, но обычно будут интересны лишь эти 2 варианта).
Если игра обнаруживает хоть 1 такой файл, то в экране настроек появляется вкладка "Обновления".
На ней можно проверить обновления и обновить игру или моды.
Сервер должен уметь лишь раздавать файлы (файловый сервер), т. е. ему не нужно запускать скрипты и делать что-то ещё.
Разве что единственным требованием выступает доступ по протоколу https
.
Таким образом, в качестве сервера обновлений вашей игры или мода может выступать даже github.
Работает всё следующим образом:
- Берутся файлы из репозитория
https://github.com/TrueCat17/reus-template
(для гитхаба - можно просто создать свой репозиторий на основе этого шаблона); - Если нет папки
zips
(по умолчанию), то её нужно создать; - Собранный в Лаунчере zip-архив поместить в эту папку
zips
; - Запустить (у себя, локально) скрипт
update.py
; - Загрузить все обновления в этой папке на сервер.
И на этом всё - сервер создан и начал работу.
Теперь стоит проверить, что доступен (например, в браузере) файл your.server/version.txt
.
Важно: файл должен быть доступен для скачивания, а не просто "красиво отображаться" со всеми HTML-элементами сайта.
Т. е. для гитхаба это будет что-то типа raw.githubusercontent.com/TrueCat17/RE-Demo-upd-sys/master/
(пример из демки).
Если по ссылке скачивается файл version.txt
,
то её нужно обрезать до последнего слэша (т. е. your.server/
из примера выше)
и добавить в upd_link.txt
в основной папке вашего проекта.
Кстати, теперь вы можете ещё и давать ссылку на zip-архив, который содержит ваш проект целиком, и вам не нужно будет хранить его где-то ещё.
Для дальнейших обновлений нужно снова поместить новый архив в папку zips
(если вы решили хранить несколько версий - будет выбран последний созданный/изменённый),
снова запустить update.py
(он напишет выбранный zip и список изменений)
и снова отправить изменения на сервер - и на этом всё!
Движок отличает файлы по их размеру (в байтах) и хэшу (sha256
).
Это значит, что если нужно скачать файл, который совпадает с уже имеющимся, то вместо скачивания будет сделано копирование.
А если копируемый файл должен будет потом удаляться, то вместо копирования и удаления будет перемещение.
Последняя оптимизация будет особенно полезна при переименовании файлов.
Также стоит отметить, что оцениваются все файлы игры, в том числе и файлы модов, в том числе и при обновлении других модов.
Кроме того, если файл изменялся несколько раз, то скачать его нужно будет лишь единожды (последнюю версию), а если по итогу была возвращена та версия, что установлена у пользователя сейчас, то скачивать вообще ничего не нужно.
Система обновлений имеет список "удалённых" файлов, и она следит лишь за тем, чтобы не было файлов по этим путям, благодаря чему все прочие незнакомые ей файлы она не трогает - в том числе и файлы модов.
Примерная оценка использования трафика при "проверке" обновления (не самого обновления):
- скачивается файл
version.txt
(несколько десятков байт + HTTP-заголовки); - если он изменился, то скачивается
info.txt
(несколько десятков килобайт + HTTP-заголовки); - HTTP-заголовки ориентировачно весят несколько килобайт на запрос.
Итого, для маленьких проектов - 30-40 КБ, для больших - 100-200 КБ, а если на сервере не было изменений с прошлой проверки - около 2 КБ.