Вебинар: C++ и неопределённое поведение - 27.02
Распараллелить сборку большого проекта на несколько компьютеров? Легко! Разбираемся, как использовать Unreal Horde — новый инструмент внутри Unreal Engine 5.5. В том числе мы посмотрим, как с его помощью запустить анализ PVS-Studio.
В игровом движке Unreal Engine версии 5.5 появился новый инструмент Horde — платформа, позволяющая использовать циклы CPU на других машинах, чтобы распределить нагрузку.
Horde содержит в себе Unreal Build Accelerator — инструмент, реализующий виртуализацию для сторонних программ (например, компиляторов C++ или анализатора PVS-Studio), позволяя им работать на удалённой машине, общаясь с инициирующей по мере необходимости.
В этой статье рассмотрим, как использовать данные возможности Unreal Engine, а также запустим анализ Unreal Engine проекта с помощью PVS-Studio сразу на нескольких машинах.
Рассмотрим, как установить сервер Horde на своей машине.
Предварительно нам необходимо привязать свой аккаунт Epic Games к GitHub. Сделать это можно в разделе Apps and Accounts в настройках аккаунта Epic Games. После привязки аккаунта на GitHub появится приглашение в организацию Epic Games, которое необходимо принять, чтобы получить возможность выполнить действия, описываемые далее.
Для установки сервера Horde на Windows необходимо всего лишь запустить соответствующий установщик. Скачать его можно по данной ссылке.
Помимо этого, можно развернуть сервер Horde с помощью Docker. Для того чтобы это сделать, нам необходимо сгенерировать Personal Access Token на GitHub, а далее авторизоваться с помощью него в GitHub Container Registry. Сделать это можно с помощью следующей команды:
docker login ghcr.io
Если авторизация прошла успешно, то следующая команда сработает, и образ Horde скачается:
docker pull ghcr.io/epicgames/horde-server:latest
Для запуска сервера Horde также потребуются внешние экземпляры Redis и MongoDB, которые должны быть настроены через файл конфигурации или переменные окружения.
Однако есть возможность развернуть сервер Horde сразу со всеми необходимыми компонентами с помощью Docker Compose. Для этого нужно взять из исходного кода Unreal Engine файл docker-compose.yaml
и выполнить в директории с этим файлом команду:
docker-compose up
Также в этом файле можно предварительно настроить порты, на которых будет развёрнут сервер Horde. По первому порту располагается интерфейс для управления сервером, а по второму — API для подключения агентов:
....
horde-server:
image: ghcr.io/epicgames/horde-server:latest
restart: always
environment:
Horde__HttpPort: 13340
Horde__Http2Port: 13342
Horde__RedisConnectionConfig: redis:30002
Horde__DatabaseConnectionString:
mongodb://horde:dbPass123@mongodb:27017/Horde?authSource=admin
ports:
- 13340:13340 # Порт для управления сервером
- 13342:13342 # Порт для подключения агентов
volumes:
- ./data:/app/Data
....
Для того чтобы добавить агентов к серверу Horde, необходимо, чтобы на компьютерах, которые будут выступать в качестве агентов, был установлен Horde Agent. Ссылку для его установки можно найти прямо на сервере Horde по URL { HordeHost }/tools
:
При установке Horde Agent с помощью .msi
необходимо указать URL сервера, к которому он будет подключён:
После окончания установки следует оставить опцию Enroll agent with the Horde Server включённой, чтобы агент отобразился в списке доступных к подключению агентов на сервере Horde. Этот список располагается по URL /agents/registration
. После того как Horde Agent будет установлен на удалённой машине, на этой странице появится информация об этом агенте:
Теперь, чтобы подключить его, потребуется лишь выбрать его в списке и нажать кнопку Enroll Agents. После этого в списке агентов на сервере (по URL /agents
) появится доступный агент:
Теперь перейдём непосредственно к тому, как использовать удалённые компьютеры для распределения нагрузки в задачах, связанных с использованием Unreal Engine.
Для того чтобы сборка проекта запускалась на нескольких компьютерах, необходимо отредактировать файл BuildConfiguration.xml
(о том, где он находится, написано в документации Unreal Engine). В данный файл добавим несколько свойств, отвечающих за использование Horde и UBA:
<?xml version="1.0" encoding="utf-8" ?>
<Configuration xmlns="https://www.unrealengine.com/BuildConfiguration">
<BuildConfiguration>
<bAllowUBAExecutor>true</bAllowUBAExecutor>
</BuildConfiguration>
<Horde>
<Server>http://horde-server-url:13340</Server>
<WindowsPool>Win-UE5</WindowsPool>
</Horde>
<UnrealBuildAccelerator>
<bForceBuildAllRemote>false</bForceBuildAllRemote>
<bLaunchVisualizer>true</bLaunchVisualizer>
</UnrealBuildAccelerator>
</Configuration>
Здесь bAllowUBAExecutor
в значении true
говорит о том, что в процессе сборки будет использоваться UBA. Группа Horde
содержит настройки используемого сервера Horde. В группе UnrealBuildAccelerator
находятся настройки UBA:
bForceBuildAllRemote
в значении false
указывает, что сборка должна проходить не только на удалённых компьютерах, но и на сервере;bLaunchVisualizer
в значении true
, говорит, что при сборке нужно отобразить визуализатор.Перейдём к проекту. Сгенерируем из .uproject
файлы проекта для Visual Studio, чтобы открыть его в этой IDE.
Теперь произведём некоторые изменения. В конструкторе класса в target-файле добавим следующее поле:
StaticAnalyzer = StaticAnalyzer.PVSStudio;
Зачем? Затем, чтобы проанализировать наш проект с помощью PVS-Studio — анализатора, который в том числе интегрируется в Unreal Build Tool для проверки Unreal Engine проектов. Причём проводить анализ мы тоже будем на нескольких компьютерах одновременно!
Примечание. Полная документация о проверке Unreal Engine проектов с помощью PVS-Studio находится по этой ссылке.
Теперь всё готово и можно приступать к запуску. Обращу ваше внимание, что у меня и коллег при сборке проекта с помощью Horde и UBA происходила проблема, связанная с тем, что файлы Unreal Engine по пути его установки были недоступны для использования сборочной системой. Если вы тоже столкнулись с такой проблемой, проверьте, что у файла, указанного в ошибке, не установлен атрибут Readonly, а также, что все пользователи имеют к нему полный доступ.
The "GenerateMSBuildEditorConfig" task failed unexpectedly.
System.UnauthorizedAccessException: Access to the path 'D:\Epic Games\UE_5.5\Engine\Source\Programs\AutomationTool\Mutable\RunMutableCommandlet\obj\Development\RunMutableCommandlet.Automation.GeneratedMSBuildEditorConfig.editorconfig' is denied.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost)
at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost)
at System.IO.StreamWriter.CreateFile(String path, Boolean append, Boolean checkHost)
at System.IO.StreamWriter..ctor(String path, Boolean append, Encoding encoding, Int32 bufferSize, Boolean checkHost)
at System.IO.File.InternalWriteAllText(String path, String contents, Encoding encoding, Boolean checkHost)
at Microsoft.CodeAnalysis.BuildTasks.GenerateMSBuildEditorConfig.WriteMSBuildEditorConfig()
at Microsoft.Build.BackEnd.TaskExecutionHost.Execute()
at Microsoft.Build.BackEnd.TaskBuilder.<ExecuteInstantiatedTask>d__26.MoveNext()
Во время сборки на экране появится визуализатор, показывающий, какие процессы происходят на каждом из Horde-агентов:
В результате получим проанализированный с помощью PVS-Studio проект.
В этой статье мы рассмотрели, как можно использовать Unreal Horde и Unreal Build Accelerator для распределения сборки Unreal Engine проекта, а также его анализа с помощью анализатора PVS-Studio.
Раздел документации Unreal Engine, посвящённый использованию Horde находится по этой ссылке. А бесплатно попробовать проверить свой Unreal Engine проект с помощью PVS-Studio можно с помощью данной ссылки.
0