Войти
ПрограммированиеФорумСеть

Как обновлять онлайн клиент? по типу доты и фортнайта. (2 стр)

Страницы: 1 2
#15
13:33, 2 июня 2018

Завести HTTPChunkInstaller не получилось. Никакой документации, ничего не работает как надо или интуитивно, никакой помощи от разрабов и комунити, так как вопрос нетривиальный и не для стандартных оффлайн перделок. Еще есть подозрение, что фортнайт не использует плагин HTTPChunkInstaller, так как в логах он не проявляется, либо они отключили его логи в фортнайте, либо они запилили всё индивидуально, как они это любят, пилить велосипеды по всякому поводу. Поэтому не понятно для кого они делали HTTPChunkInstaller, если для нас, то почему нет примеров и документации, так что явно не для нас. В нём совершенно ничего нет, и ничего не предусмотрено, ни событий, ни порядка выполнения, он просто запускается при старте и всё, параллельно с моей картой, а точнее даже после загрузки самой карты и всё, при том что очевидно, что обновление должно происходить до загрузки основной карты, но ничего, никаких событий или функций или конфигов для указания уровня для загрузки обновления и игрового уровня, нет,  ничего разумеется он не обновляет, всё заканчивается на скачивании манифеста и всё, дальше ему что то не нравится. Вообще в целом тема ММО полностью замалчивается разрабами ue4, никаких доков, никаких примеров, ничего, но в коде что то вроде есть, какие то модули, но это что то очевидно только для самих эпиков и их проектов. Лол и это при том что этот плагин существует в ue4 уже очень давно.

Есть еще вариант напрямую попробовать юзать BuildPatchServices через лаунчер и попробовать обновить хоть что то.

Благо есть Steam, буду разбираться с ним.

UPD: ладно, попробую завести BuildPatchInstaller через лаунчер, не упала мне Streaming Installation в лице HTTPChunkInstaller. Хоть я и буду использовать исключительно Steam, но мне всё же интересно получится ли у меня завести патчинг в ue4.

UPD2: еще раз чекнул логи фортнайта и там в списке плагинов всё таки числится HTTPChunkInstaller, поэтому они его как то используют, но опять же как, остаётся загадкой. А еще там числится плагин LauncherChunkInstaller, которого в ue4 для простых смертных нет.


#16
21:18, 2 июня 2018

gamedeveloper01
> никакой помощи от разрабов и комунити

А что пробовали поспрашивать на форуме https://forums.unrealengine.com

#17
23:35, 2 июня 2018

ELena_Shloemovich
> А что пробовали поспрашивать на форуме https://forums.unrealengine.com
Я на ансерхабе спрашивал, но дело не в этом, там уже до меня спрашивали что то подобное больше года назад и 0 реакции. Но не суть.

Короче получилось завести BuildPatchServices через лаунчер, всё обновляет как надо, как и ожидалось. Бинарники обновляются и pak файл обновляется. Скачиваются только нужные чанки. Но есть еще пара нюансов:
- Я не пробовал еще использовать для файлов HTTP сервер, тестировал пока что на локальной директории.
- Я толи как то неудачно создал новую версию чанков, то ли что, но на этот раз получился апдейт на 300 мб, а раньше был на 6 мб, хотя весь проект 700 мб, ну хоть не все файлы качал, но он правильно определил какие файлы нужно было обновить. Короче нужно еще разобраться почему патч создался так криво, поиграться с настройками.

Как только разберусь с этими нюансами напишу что и как нужно сделать чтобы завести эту шарманку, с HTTPChunkInstaller уже разбираться не буду он вообще тёмный.

#18
2:59, 3 июня 2018

Итак, протестировал HTTP сервер для BuildPatchServices, всё работает. А вот от больших патчей избавиться не удалось, видимо так и должно быть. Суть в том, что pak файл занимает 500 MB, я в проекте изменяю только 1 букву в TextBox UI, и всё, в результате патч на 350 MB. Отсюда видимо вывод, что не особо ue4 умеет дифференцировать свои паки, и видимо для того чтобы сделать патчи меньшего размера нужно всё таки создавать отдельные паки. Либо создавать _P.pak накопительный патч для нового контента. Опять я не проверял как это сделано в фортнайте, там всего 4 пака, и вроде как 4й - это патч, но я не проверил, а фортнайт уже удалил, хорошо бы проверить если при очередном обновлении первые 3 пака останутся неизменными и 4й изменится, тогда станет всё ясно, но не суть.

Короче итог: (UE 4.19.2)
HTTPChunkInstaller - по научному Streaming Installer - инсталлятор который обновляет или подгружает на лету только контент (паки, а также конфиги?) игры, без бинарников (вроде как), в её запущенном состоянии. Но как это сделать я не особо разобрался, хотя я изначально хотел обновить ей бинарники, но сейчас понимаю что это вроде как невозможно. Для обновления или подгрузки паков использует BuildPatchServices.

В редакторе настройках проекта Project - Packaging свойство Build HTTP Chunk Install Data - не даёт никакого эффекта, не работает, оно должно генерировать HTTP чанки, идентично BuildPatchTool.

BuildPatchTool.exe - нужно скомпилировать её в исходниках Engine/Programs. Она собственно и создаёт новую версию HTTPChunks + Manifest. (HTTPChunks это не тоже самое что PakChunks). По сути HTTPChunks это просто разбитые на мелкие части файлы, вроде как немного используют бинарную дифференциацию, и в итоге приходится всё таки качать не целый измененный файл, а лишь его часть, но что то видимо не особо это работает, в итоге приходится качать чуть ли не половину файла при малейшем его изменении, так что лучше иметь много мелких файлов в проекте и мало больших, а если большие файлы есть, то лучше чтоб они не менялись во время патчей.

BuildPatchServices - этот модуль можно использовать для обновления всего клиента, включая бинарники. Он умеет самостоятельно загружать файлы по HTTP, если указать путь, который начинается с "http://" или просто с локального каталога "C:/", автоматически по URL определяет как нужно качать файлы.

Порядок действий:
Предварительная настройка:
- Создаём тестовый проект Game, допустим ThirdPersonCPP.
- Допустим он будет по адресу "C:/Game"
- Открываем VS 2017, билдим Game и Programs/BuildPatchTool (можно в режиме по умолчанию: Development Editor).
- Запускаем ue4 editor и открываем проект Game.
- File->Package Project->Packaging Settings:

  Use Pak File = true
  Generate Chunks = true (можно и не ставить, это для Pak чанков, это не тоже самое что HTTP чанки).
  Build Configuration = Shipping.
  Остальное по умолчанию.
- File->Package Project->Build Configuration = Shipping.

Билд:
- File->Package Project->Windows->Windows (64 bit), создаём и выбираем папку "C:/Game/Release"

После того как релиз забилдился, ниже подразумеваем, что UE установлен в "C:/UE":
- Для начала, требуется чтобы папки "C:/Game/Cloud" не существовало, иначе BuildPatchTool откажется билдить, такой вот бред.
- Пуск->Выполнить->Cmd (открываем шелл винды):

  cd C:\UE\Engine\Binaries\Win64
  buildpatchtool-win64-development.exe -mode=PatchGeneration -BuildRoot="C:\Game\Release\WindowsNoEditor" -CloudDir="C:\Game\Cloud" -AppName="Game" -BuildVersion="1.0.0" -AppLaunch="Game.exe" -AppArgs=""

- Имеем на выходе "C:/Game/Cloud" в которой манифест и HTTP чанки.
- Переименовываем Game1.0.0.manifest в Master.manifest сразу для удобства.

Собственно это основной цикл создания новых HTTP чанков. Первый релиз готов. Затем содержимое Cloud можно залить на HTTP сервер или использовать локально.

#19
3:21, 3 июня 2018

Дальше собственно создаём еще один проект "C:/Launcher", пусть это будет тот же ThirdPersonCPP:
- заранее создаём на всякий случай пустую папку "C:/Game/Install" - тут будет как бы наша установленная игра.
- добавляем в Launcher.Build.cs:

  PublicDependencyModuleNames.Add("BuildPatchServices");
- добавляем в ALauncherGameMode:

#include "BuildPatchServices.h"
virtual void BeginPlay() override
{
  Super::BeginPlay();

  IBuildPatchServicesModule* buildPatchServices = &FModuleManager::LoadModuleChecked<IBuildPatchServicesModule>(TEXT("BuildPatchServices"));
  IBuildManifestPtr installManifestPtr = buildPatchServices->LoadManifestFromFile(TEXT("C:/Game/Cloud/Master.manifest"));
  if(installManifestPtr.IsValid())
  {
    BuildPatchServices::FInstallerConfiguration installConfig(installManifestPtr.ToSharedRef());
    installConfig.CloudDirectories.Add(TEXT("C:/Game/Cloud"));
    //installConfig.CloudDirectories.Add(TEXT("http://localhost:5000"));
    installConfig.InstallDirectory = TEXT("C:/Game/Install");
    installConfig.bRunRequiredPrereqs = false; // для теста нам не надо устанавливать пререквизиты.
    buildPatchServices->StartBuildInstall(MoveTemp(installConfig), FBuildPatchBoolManifestDelegate::CreateUObject(this, &ALauncherGameMode::OnInstallCompleted));
  }
}
void OnInstallCompleted(bool bSuccess, IBuildManifestRef BuildManifest)
{
  if(bSuccess)
  {

  }
}

- Просто в редакторе запускаем лаунчер. Смотрим логи (Window->Developer Tools->Output Log), там будет отображаться процесс установки после нажатия Play. В результате в папке "C:/Game/Install" появится билд игры, HTTP чанки которого находились в "C:/Game/Cloud".

Таким образом мы скачали и установили полностью весь клиент с нуля. Для того чтобы потом обновлять то что находится в "C:/Game/Install", создаём новый билд для "Game" с каким либо изменением, заново генерируем для него HTTP чанки с новой версией, предварительно удалив или переместив старые. Не забываем переименовать манифест в Master.manifest. Опять запускаем лаунчер.

Вот если что ссылка как можно сделать свой тестовый HTTP сервер: https://www.meziantou.net/2017/09/07/starting-a-http-file-server-… -0-and-kestre
Или скачать готовый, например: www.rejetto.com/hfs/

PS: ладно всё, следующий шаг - разобраться как создавать патчи в Steam.

Страницы: 1 2
ПрограммированиеФорумСеть

Тема в архиве.