# Unreal Engine — начало работы

Учитесь на практике и разверните свой первый выделенный сервер на Edgegap. К концу этого руководства вы бесплатно развернёте выделенный сервер с Edgegap.

Сборка с Docker Desktop — самый быстрый, простой и надёжный способ начать.

{% embed url="<https://youtu.be/q7ljcr9rAWE>" %}

## ✔️ Подготовка

<details>

<summary><a href="https://open.docker.com/extensions/marketplace?extensionId=edgegap/docker-extension">Установите расширение Edgegap Quickstart Docker</a></summary>

* Установите из Docker Desktop / Extensions / Browse или [по ссылке](https://open.docker.com/extensions/marketplace?extensionId=edgegap/docker-extension).

<figure><img src="/files/59c0ba8e90039fe46e40cf28594ebf3e276911eb" alt=""><figcaption></figcaption></figure>

</details>

{% hint style="info" %}
**Уверены в своих сборках сервера?** Перейдите к [#customize-server-image](#customize-server-image "mention") и [Расширенные возможности](/ru/learn/advanced-features.md).
{% endhint %}

## ⚙️ 1. Настройка проекта <a href="#id-1-configure-project" id="id-1-configure-project"></a>

{% hint style="info" %}
Этот способ не требует загрузки исходного кода Unreal Engine или сборки его из исходников!
{% endhint %}

☑️ Начните с **проверки версии Unreal Engine** — предварительно заполнено значением из файлов вашего проекта.

☑️ **Введите имя пользователя GitHub и** [**PAT**](#user-content-fn-1)[^1] из [#preparation](#preparation "mention"), чтобы загрузить зависимости с GitHub.

## 🔧 2. Сборка игрового сервера <a href="#id-2-build-game-server" id="id-2-build-game-server"></a>

Теперь мы соберём и подготовим ваш проект, а затем упакуем его в легко переиспользуемый образ Docker.

☑️ Вы можете настроить следующие параметры (или оставить значения по умолчанию):

* **Имя образа** — это уникальный идентификатор на ваш выбор, которым помечается сборка сервера перед публикацией.
  * Обычно сюда включают название игры — например, «my-game-server».
* **Тег образа** — это идентификатор, указывающий на конкретную версию вашего образа.
  * Термин «артефакт сборки» иногда используется для обозначения конкретной версии вашего образа.
  * Для тегов отлично подходят временные метки, например `2024.01.30-16.23.00-UTC`  (по умолчанию).

☑️ **Собрать проект** когда вы будете довольны настройкой. Завершение этого шага добавит новый образ с исполняемым файлом вашего игрового сервера Linux в ваш локальный Docker-клиент.

✅ Теперь можно перейти к следующему шагу.

## 🧪 3. Тестирование сервера локально <a href="#id-3-test-server-locally" id="id-3-test-server-locally"></a>

☑️ **Выберите тег образа, который хотите запустить локально** (удалённые образы будут загружены). При желании можно указать дополнительные [аргументы docker run](https://docs.docker.com/reference/cli/docker/image/build/#options) для настройки локального теста:

* `-p 7777:7777/udp` — это сопоставление портов [локального контейнера](/ru/learn/orkestraciya/application-and-versions.md#port-mapping),
* `-e ARBITRIUM_PORT_GAMEPORT_INTERNAL=7777`  — это [переменная окружения](#environment-variables) имитирующая реальное развёртывание Edgegap и сообщающая вашему игровому серверу внутренний порт, на котором нужно слушать подключения игроков.

☑️ Когда будете довольны настройкой, нажмите **Запустить локальный сервер**. Завершение этого шага приведёт к **запуску нового контейнера** на вашей машине для разработки.

☑️ Теперь пора подключить игровой клиент Unreal Engine Editor (PIE) к локальному серверному контейнеру. Откройте консоль Unreal PIE с помощью `~`  (тильда) и подключитесь с помощью `open <ip>:<port>`:

* `ip`  = `localhost`  или `127.0.0.1`  (в большинстве случаев эквивалентно),
* `port`  = случайное внешнее значение порта контейнера в интерфейсе Docker GUI.

✅ Теперь можно перейти к следующему шагу.

<details>

<summary>Устранение неполадок и FAQ</summary>

Не удаётся подключить клиентов к серверу — `Время ожидания запроса истекло.` , `请求超时` , `ConnectionFailed` , или `Проверка порта не удалась`

* Сначала убедитесь, что контейнер запущен и в журналах нет ошибок во время выполнения.
* Пожалуйста, проверьте, что значения портов в команде `docker run` совпадают.
* Пожалуйста, убедитесь, что ваш игровой клиент подключается к **внешнему порту** , указанному на странице сведений о контейнере; это значение всегда будет случайным по соображениям безопасности.
* Пожалуйста, убедитесь, что вы переименовали целевой файл и настроили сборки игры, как описано на шаге [#id-1-configure-project](#id-1-configure-project "mention").

***

Мой контейнер запущен, но я всё равно не могу подключиться ещё несколько минут после этого.

* После запуска контейнера начинается инициализация игрового движка. Этот процесс может занимать от нескольких секунд до нескольких минут, и в этот период сервер не принимает подключения игроков.
* Рассмотрите возможность оптимизации инициализации сервера, чтобы сократить это время.
* Игровые клиенты должны повторять попытку подключения каждые 1 секунду в течение ограниченного времени (в зависимости от длительности инициализации), после чего они должны возвращаться в матчмейкинг.
* Рассмотрите возможность добавления загрузочного экрана, чтобы сервер мог выполнять инициализацию (и переход в случае Unreal Engine) одновременно с клиентами, синхронизируя при этом состояние обеих сторон.

***

`Предупреждение: не удалось создать сокет для адреса привязки`

* Пожалуйста, установите плагин Epic’s Steam Subsystem через магазин ассетов Fab.
* При использовании Edgegap Integration Kit (EGIK) с исходной версией SteamCore, загруженной с GitHub, плагин Epic’s Steam Subsystem не включён из-за политики распространения плагинов Epic Games.

***

Я подключился, но мой экран полностью чёрный.

* Проверьте, что у вас правильно **Game Default Map** указано в **Edit / Project Settings / Maps & Modes**.

</details>

## ☁️ 4. Публикация на Edgegap <a href="#id-4-publish-to-edgegap" id="id-4-publish-to-edgegap"></a>

☑️ **Выберите имя приложения** чтобы помечать и группировать похожие образы на Edgegap.

☑️ **Выберите тег образа, который хотите опубликовать** и **Загрузить образ**. Завершение этого шага приведёт к загрузке образа вашего сервера в Edgeap Registry и созданию новой [версии приложения](/ru/learn/orkestraciya/application-and-versions.md) в вашем веб-браузере. **Обязательно создайте свой** [**локального контейнера**](/ru/learn/orkestraciya/application-and-versions.md#port-mapping) **когда будет предложено,** со значениями по умолчани&#x44E;**.**

{% hint style="success" %}
Нашли баг и нужно снова собрать/опубликовать? Используйте **Rebuild from Source** в [#id-2.-build-game-server](#id-2.-build-game-server "mention") и [#id-4.-publish-to-edgegap](#id-4.-publish-to-edgegap "mention") **с текущими значениями ввода расширения быстро.**
{% endhint %}

✅ Теперь можно перейти к следующему шагу.

## 🚀 5. Развёртывание в облаке <a href="#id-5-deploy-to-cloud" id="id-5-deploy-to-cloud"></a>

☑️ Теперь мы проведём финальное тестирование и **подключим ваш Unreal Engine Editor к вашему облачному развёртыванию**. Возьмите **хост развёртывания** вместо IP сервера и **внешнему порту**, откройте консоль Unreal в игровом клиенте (тильда `~`) и введите `open {host}:{port}` .

<details>

<summary>Устранение неполадок и FAQ</summary>

Не удаётся подключить клиентов к серверу — `Время ожидания запроса истекло.` , `请求超时` , `ConnectionFailed` , или `Проверка порта не удалась`

* Сначала убедитесь, что развёртывание готово, и что в журнале развёртывания нет исключений или ошибок во время выполнения. Если развёртывание остановилось, проверьте журналы в нашей [Панели управления](https://app.edgegap.com/deployment-management/deployments/list).
* Пожалуйста, проверьте, что настройка порта в параметрах netcode вашей серверной сборки совпадает с внутренним портом в вашей [версии приложения](https://app.edgegap.com/application-management/applications/list). Для сборок с плагином порт настраивается автоматически. Вы можете изменить сопоставление портов, отредактировав [версии приложения](https://app.edgegap.com/application-management/applications/list) без пересборки. Найдите свой протокол в интеграции netcode.
* Пожалуйста, убедитесь, что ваш игровой клиент подключается к **внешнему порту** , указанному на странице сведений о развёртывании; это значение всегда будет случайным по соображениям безопасности.
* Пожалуйста, убедитесь, что вы переименовали целевой файл и настроили сборки игры, как описано на шаге [#id-1.-configure-project](#id-1.-configure-project "mention").
* Вы находитесь в Китае и используете [Smart Fleets](https://docs.edgegap.com/docs/deployment/session/fleet-manager/fleet)? Ваше подключение может быть заблокировано Великим китайским файрволом. Рассмотрите возможность добавить в свой флот сервер, расположенный в Китае, или использовать VPN для подключения.

***

Моё развёртывание готово, но я всё равно не могу подключиться ещё несколько минут после этого.

* После того как развёртывание становится готовым, начинается инициализация игрового движка. Этот процесс может занимать от нескольких секунд до нескольких минут, и в этот период сервер не принимает подключения игроков.
* Рассмотрите возможность оптимизации инициализации сервера, чтобы сократить это время.
* Игровые клиенты должны повторять попытку подключения каждые 1 секунду в течение ограниченного времени (в зависимости от длительности инициализации), после чего они должны возвращаться в матчмейкинг.
* Рассмотрите возможность добавления загрузочного экрана, чтобы сервер мог выполнять инициализацию (и переход в случае Unreal Engine) одновременно с клиентами, синхронизируя при этом состояние обеих сторон.

***

`Предупреждение: не удалось создать сокет для адреса привязки`

* Пожалуйста, установите плагин Epic’s Steam Subsystem через магазин ассетов Fab.
* При использовании Edgegap Integration Kit (EGIK) с исходной версией SteamCore Integration Kit (SIK), загруженной с GitHub, плагин Epic’s Steam Subsystem не включён из-за политики распространения плагинов Epic Games.

***

Я подключился, но мой экран полностью чёрный.

* Проверьте, что у вас правильно **Game Default Map** указано в **Edit / Project Settings / Maps & Modes**.
* Проверьте, что [проверка совместимости версии Unreal Engine отключена](#id-2.-configure-game-server-builds) в `DefaultEngine.ini`.

***

Моё развёртывание остановилось/перезапустилось, и я больше не могу получить доступ к его журналам.

* В случае, если процесс сервера аварийно завершится из-за исключения, наша система попытается автоматически перезапустить сервер. Рассмотрите возможность тестирования сервера локально, чтобы выявить корневую причину.
* Мы храним журналы только на время развёртывания; если вы хотите просмотреть журналы после остановки развёртывания, пожалуйста, [интегрируйте стороннее хранилище журналов](https://docs.edgegap.com/docs/deployment/endpoint-storage).
* См. [/pages/4ad5d792bc82dceeaec6d7dd56165ae188da0417#id-5.-deployment-stopped](https://docs.edgegap.com/ru/pages/4ad5d792bc82dceeaec6d7dd56165ae188da0417#id-5.-deployment-stopped "mention") чтобы узнать все причины остановки вашего развёртывания.

***

Моё развёртывание автоматически остановилось через X минут.

* Развёртывания Free Tier ограничены 60 минутами; пожалуйста, рассмотрите возможность обновления аккаунта.
* Все развёртывания будут завершены через 24 часа работы в соответствии с нашей политикой санитарной очистки серверов, для обслуживания инфраструктуры и чтобы предотвратить неожиданные расходы, если развёртывание не было корректно остановлено. Для долгоживущих серверов рассмотрите использование [Частные парки](/ru/learn/orkestraciya/chastnye-parki.md) с [Постоянство](/ru/learn/orkestraciya/postoyanstvo.md).
* См. [/pages/4ad5d792bc82dceeaec6d7dd56165ae188da0417#id-5.-deployment-stopped](https://docs.edgegap.com/ru/pages/4ad5d792bc82dceeaec6d7dd56165ae188da0417#id-5.-deployment-stopped "mention") чтобы узнать все причины остановки вашего развёртывания.

***

Что произойдёт, если игрок покинет моё развёртывание?

* По умолчанию серверы не отклоняют подключения игроков. Аутентификация игроков — задача ваших разработчиков, поскольку можно использовать множество разных методов и провайдеров аутентификации игроков.
* Игровые клиенты могут сохранять информацию о подключении локально, чтобы попытаться переподключиться в случае неожиданного сбоя клиента.
* Чтобы позволить игрокам присоединяться к уже идущим играм, рассмотрите использование [Подробный обзор](/ru/learn/podbor-sopernikov/matchmaker-in-depth.md#backfill) или [Сессии](https://docs.edgegap.com/docs/deployment/session).

***

Мой сервер показывает 100% загрузку CPU после перехода в состояние готовности.

* Это может не быть проблемой, поскольку игровые движки обычно выполняют ресурсоёмкие операции CPU во время инициализации сервера. Если загрузка CPU не снижается через 2–3 минуты после запуска развёртывания, возможно, вам нужно оптимизировать сервер или увеличить ресурсы версии приложения.
* Снижение tick rate может помочь контролировать загрузку CPU за счёт обработки меньшего количества сообщений.
* В Free Tier вам доступны только 1,5 vCPU и 3 ГБ памяти (RAM).
* Вы можете увеличить выделенные ресурсы при создании новой версии приложения. Вы можете дублировать версию приложения в нашей Панели управления и корректировать эти значения по мере необходимости, без пересборки сервера или образа.

***

Моё развёртывание постоянно перезапускается и показывает ошибку `OOM kill`

* Это вызвано превышением выделенного объёма памяти. Рассмотрите возможность оптимизации использования памяти с помощью пулов объектов, сжатия или удаления ненужных объектов из сцены.
* В Free Tier вам доступны только 1,5 vCPU и 3 ГБ памяти (RAM).
* Вы можете увеличить выделенные ресурсы при создании новой версии приложения. Вы можете дублировать версию приложения в нашей Панели управления и корректировать эти значения по мере необходимости, без пересборки сервера или образа.

***

Иногда использование памяти (RAM) моего сервера резко возрастает до высокого значения — это проблема?

* Пока вы остаётесь в пределах выделенного объёма памяти версии приложения, это не проблема.
* Превышение выделенного объёма памяти версии приложения приведёт к `OOM kill` (см. выше).

***

Будет ли производительность моего сервера ухудшаться из-за других серверов, работающих на той же машине?

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

</details>

## 👉 Следующие шаги

### Остановка развёртываний

Когда матч заканчивается (или игроки уходят), ваше развёртывание можно остановить, чтобы сэкономить средства. [Запуск пустым или лишь частично заполненным может неоправданно увеличить ваши расходы!](https://edgegap.com/blog/how-session-fill-rate-affects-your-multiplayer-hosting-costs)

Если вы следовали этому руководству и собрали с помощью нашего Docker Extension, вы можете просто вызвать метод `FGenericPlatformMisc::RequestExit` . Мы добавили скрипт, управляющий процессом вашего сервера в упакованном образе, который автоматически выполнит корректное завершение развёртывания.

Чтобы настроить управление жизненным циклом сервера, измените наш [пример `StartServer.sh`](https://github.com/edgegap/edgegap-unreal-buildutils/blob/main/StartServer.sh)  скрипт.

{% hint style="info" %}
Предпочитаете управлять жизненным циклом из Unreal? См. [Инструменты разработчика](/ru/unreal-engine/developer-tools.md#integration-kit) для blueprint API самозавершения.
{% endhint %}

### Внедрённые переменные

Читайте полезную информацию, такую как ID развёртывания, IP-адрес сервера, местоположение сервера и многое другое, обращаясь к внедрённым переменным окружения. Каждое развёртывание автоматически включает:

* [Переменные развёртывания](/ru/learn/orkestraciya/deployments.md#injected-environment-variables) — автоматически предоставляются Edgegap,
* [Переменные матчмейкинга](/ru/learn/podbor-sopernikov/matchmaker-in-depth.md#injected-environment-variables) — автоматически предоставляются Edgegap при использовании [Подбор соперников](/ru/learn/podbor-sopernikov.md),
* [Переменные версии приложения](/ru/learn/orkestraciya/application-and-versions.md#injected-variables) — настраиваемые парные значения ключ-значение, задаваемые вами.

{% hint style="success" %}
Импортируйте наш [Инструменты разработчика](/ru/unreal-engine/developer-tools.md#integration-kit) в **легко читайте типизированные переменные с помощью Blueprints**.
{% endhint %}

### Профилирование серверов

Чтобы понять и оптимизировать проблемы производительности сервера на Edgegap, изучите [Развертывания](/ru/learn/orkestraciya/deployments.md#container-logs), [Развертывания](/ru/learn/orkestraciya/deployments.md#container-metrics), и другие [Развертывания](/ru/learn/orkestraciya/deployments.md#dashboard-monitoring) инструменты, имеющиеся в вашем распоряжении.

Вы также можете использовать существующие инструменты профилирования Unreal Engine с Edgegap:

* [Настройте трассировку на сервере Unreal Engine](https://dev.epicgames.com/documentation/en-us/unreal-engine/developer-guide-to-tracing-in-unreal-engine) (встроенные и пользовательские события):
  * сохраняйте trace на диск сервера с помощью `-tracefile`, загружайте в стороннее хранилище и анализируйте офлайн,
  * или передавайте данные trace с помощью [Развертывания](/ru/learn/orkestraciya/deployments.md#port-mapping) для внутреннего порта `1981` по протоколу UDP.
* Анализируйте [Memory Insights](https://dev.epicgames.com/documentation/en-us/unreal-engine/memory-insights-in-unreal-engine) и [Networking Insights](https://dev.epicgames.com/documentation/en-us/unreal-engine/networking-insights-in-unreal-engine) и [#optimize-server-builds](#optimize-server-builds "mention").

### Session Automation

### Оптимизируйте сборки

**Настройте чанкинг ассетов, чтобы отделить ассеты только для клиента от ассетов сервера.**

* Изучите [техники и рекомендации по Asset Chunking](https://dev.epicgames.com/documentation/en-us/unreal-engine/preparing-assets-for-chunking-in-unreal-engine) от Epic.

**Исключите ассеты и плагины, которые нужны только клиенту и не требуются для работы сервера.**

* Узнайте о [исключении ассетов и плагинов на этапе сборки](https://dev.epicgames.com/community/learning/tutorials/Kp1k/unreal-engine-build-time-asset-and-plugin-exclusion).

**Пересмотрите стратегию запекания контента.**

* Рассмотрите [Cooking on the Fly (COTF)](https://dev.epicgames.com/documentation/en-us/unreal-engine/build-operations-cooking-packaging-deploying-and-running-projects-in-unreal-engine#cookonthefly) чтобы отложить запекание клиентских ассетов и ускорить сборки сервера.

**Реализуйте Level Streaming, чтобы снизить нагрузку на память во время работы.**

* Если в вашем дизайне игроки в основном находятся вместе в одной области карты, [level streaming может сократить использование памяти вашим сервером](https://dev.epicgames.com/documentation/en-us/unreal-engine/level-streaming-in-unreal-engine) более чем на 60% и улучшить производительность клиента!

**Включайте только то, что действительно необходимо для работы сервера.**

* Копирование неиспользуемых файлов в образы приводит к их раздуванию, более долгим загрузкам, более медленному кэшированию и более медленному общему запуску сервера. [Изучите рекомендации по оптимизации Docker-образов](https://docs.docker.com/build-cloud/optimization/#dockerignore-files).

<details>

<summary>Пример <code>.dockerignore</code> файл для удаления лишних файлов.</summary>

```docker
# Скомпилированные объектные файлы
*.slo
*.lo
*.o
*.obj

# Предкомпилированные заголовки
*.gch
*.pch

# Скомпилированные динамические библиотеки
*.so
*.dylib
*.dll

# Файлы модулей Fortran
*.mod

# Скомпилированные статические библиотеки
*.lai
*.la
*.a
*.lib

# Исполняемые файлы
*.exe
*.out
*.app
*.ipa

# Эти файлы проекта могут быть сгенерированы движком
*.xcodeproj
*.xcworkspace
*.sln
*.suo
*.opensdf
*.sdf
*.VC.db
*.VC.opendb

# Предварительно обработанные ассеты
**/SourceArt/**/*.png
**/SourceArt/**/*.tga

# Сборки
**/Build/*

# Белый список файлов PakBlacklist-<BuildConfiguration>.txt
!**/Build/*/
**/Build/*/**
!**/Build/*/PakBlacklist*.txt

# Не игнорировать файлы иконок в Build
!**/Build/**/*.ico

# Файлы конфигурации, сгенерированные редактором
**/Saved/*
**/Intermediate/*
**/DerivedDataCache/*
**/Binaries/*
**/Build/*
**/Releases/*
**/Packaged/*
```

</details>

**Рассмотрите использование** [**многоэтапных сборок Docker (ссылка)**](https://docs.docker.com/build/building/multi-stage/)**.**

* Вынесите крупные зависимости сервера в отдельный образ, чтобы переиспользовать их в многоэтапных сборках. Docker будет кэшировать каждый слой и просто переиспользовать предыдущую версию, пропуская загрузку этой части, если не указано иное, экономя вам трафик и время ожидания завершения загрузки.
* Если вы не уверены, почему одна из команд вашего Dockerfile выдаёт ошибку, попробуйте отладить локально. Создайте новый этап прямо перед возникновением проблемы (добавьте вторую `FROM` команду), используйте `--target` чтобы указать процессу сборки остановиться на проблемном этапе, а затем `docker exec -it {container} /bin/bash` чтобы войти в интерактивный терминал внутри вашего контейнера. После этого вы можете использовать команды shell в базовом образе, чтобы исследовать проблему дальше (например, `top` в Ubuntu).

### Настроить образ

Мы также поддерживаем добавление собственного Dockerfile для пользователей, которым требуется больше контроля над образами из-за оптимизации размера сборки, лишних зависимостей или необходимости более сложного процесса запуска. Теперь мы поделимся несколькими советами и лучшими практиками «сделай сам».&#x20;

[^1]: Personal Access Token


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.edgegap.com/ru/unreal-engine.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
