虚幻引擎

通过实践学习并在 Edgegap 上部署您的第一个专用服务器。在本指南结束时,您将能在无费用情况下使用 Edgegap 部署一个专用服务器。

使用 Docker Desktop 构建是开始的最快、最简单且最可靠的方法。

✔️ 准备

在开始之前,请确保 创建一个 Edgegap 免费帐户 (无需信用卡)。

在你的开发机器上配置一些必需项:

安装 Docker Desktop(或 Docker CLI)
安装 Edgegap 快速启动 Docker 扩展
在 GitHub 上获取对 Unreal Engine 资源的访问权限
生成 GitHub 个人访问令牌(经典)
  • 仅启用权限 [读取:软件包] ,

  • 生成令牌 - 请安全保存此值,您将无法再次看到它.

对您的服务器构建很有把握? 跳到 虚幻引擎高级功能.

⚙️ 1. 配置项目

无论您使用的是 Windows、Mac 还是 Linux 机器,您都将 需要为 Linux 运行时构建您的服务器,因为如今大多数云提供商(包括 Edgegap)都运行在 Linux 上。别担心,不需要 Linux 知识。

此方法不需要下载 Unreal 源代码或从源构建 Unreal 引擎!

☑️ 首先 验证您的 Unreal Engine 版本 - 已从您的项目文件中预填默认值。

☑️ 输入 GitHub 用户名和 PAT 来自 虚幻引擎,以便从 GitHub 下载依赖项。

生成 GitHub 个人访问令牌(经典)
  • 仅启用权限 [读取:软件包] ,

  • 生成令牌 - 请安全保存此值,您将无法再次看到它.

☑️ 禁用 Unreal Engine 版本兼容性检查 用于专用服务器和 设置 IpNetDriver 作为默认驱动或回退驱动 用于复制网络:

☑️ 重启 Unreal Engine 以重新加载最新更改。

☑️ 创建一个专用服务器目标脚本 通过复制你的 <PROJECT>Editor.Target.cs 文件到项目根文件夹并将副本重命名为 <PROJECT>Server.Target.cs.

☑️ 在你的服务器目标脚本中替换所有对 单词 Editor 使用 服务器 的引用。

☑️ 启用标准输出服务器日志 通过在你的服务器目标脚本中添加覆盖:

✅ 现在您可以继续下一步。

可选:Steam 集成

集成 Steam,使用 IpNetDriver 作为您的默认网络驱动并确认 适用于 Linux 的 64 位 steamclient.so 已复制到镜像中的路径 /home/ubuntu/.steam/sdk64/ .

下载 steamclient.so

Dockerfile
...
RUN mkdir -p /home/ubuntu/.steam/sdk64
COPY ./steamclient.so /home/ubuntu/.steam/sdk64/steamclient.so
RUN chmod 755 /home/ubuntu/.steam/sdk64/steamclient.so
...

请确保 禁用 Steam 网络功能,该功能会通过 Steam 中继发送数据包,可能导致连接问题或延迟骤增。这并不妨碍您使用其他 Steamworks 功能或在 Steam 商店发布游戏。

Config/DefaultEngine.ini
[OnlineSubsystemSteam]
bUseSteamNetworking=false

🔧 2. 构建游戏服务器

现在我们将构建并打包(cook)您的项目,并将其打包成一个可重用的 docker 镜像。

在一支开发团队中工作意味着共享代码。当事情出错时,你最不想听到的是“在我机器上可以运行”。游戏服务器必须能够在任何机器上可靠运行,因为成功的游戏服务器将运行在全球成千上万台服务器上。

为帮助使你的服务器可靠,我们使用 Docker——虚拟化软件,用于确保从操作系统级别到所有服务器代码依赖项在任何情况下、任何位置启动服务器时都完全一致。

我们建议观看 “永远不要本地安装”(视频). 使用 Docker 时你不需要使用 Dockerhub。Docker ≠ Dockerhub。把 Docker 想象成一个编程引擎,而 Dockerhub 则像它的应用商店。

☑️ 您可以配置以下选项(或保留默认):

  • 镜像名称 是您选择的唯一标识符,用于在发送前标记您的服务器构建。

    • 通常,这将包含游戏名称,例如 “my-game-server”。

  • 镜像标签 是指向镜像特定版本的标识符。

    • 术语“构建产物”有时用来指代镜像的特定版本。

    • 时间戳是标记的好选项,例如 2024.01.30-16.23.00-UTC (默认)。

☑️ 构建项目 在您对配置满意后点击。一旦完成此步骤,将在本地 Docker 客户端中添加一个包含您的 Linux 游戏服务器可执行文件的新镜像。

✅ 您现在可以继续到下一步。

🧪 3. 在本地测试服务器

让我们尝试在本地(在你的机器上)部署并连接一个游戏客户端,以确保服务器镜像在我们上传和部署之前正常运行(上传和部署可能需要一些时间)。

☑️ 选择您希望在本地运行的镜像标签 (远程镜像将被下载)。可选地,还可以提供更多 docker run 参数 以自定义您的本地测试:

  • -p 7777:7777/udp - 这是您的本地容器 端口映射,

  • -e ARBITRIUM_PORT_GAMEPORT_INTERNAL=7777 是一个 环境变量 模拟真实的 Edgegap 部署,告诉您的游戏服务器用于监听玩家连接的内部端口。

☑️ 一旦您对配置满意,点击 启动本地服务器。完成此步骤将导致 在您的开发机器上启动一个新容器

☑️ 现在是将您的 Unreal Engine 编辑器(PIE)游戏客户端连接到本地服务器容器的时候了。使用打开控制台( ~ (波浪号))并使用以下命令连接 open <ip>:<port>:

  • ip = localhost127.0.0.1 (在大多数情况下等同),

  • 端口 = Docker GUI 中容器的随机外部端口值。

☑️ 一旦你确认可以连接到本地服务器容器并且能够顺利游玩,你可以删除该容器 🗑️ 以释放机器上的资源供其他程序使用。

✅ 您现在可以继续到下一步。

故障排除与常见问题

无法将客户端连接到服务器 - 请求超时。 , 请求超时 , ConnectionFailed ,或 端口验证失败

  • 首先,确保容器正在运行,并且日志中没有运行时错误。

  • 请验证您在 docker run 命令中使用的端口值是否匹配。

  • 请确保您的游戏客户端正在连接到 外部端口 ,该值显示在容器详情页面上,出于安全原因该值将始终是随机的。

  • 请确保您已按步骤所述重命名目标文件并配置了游戏构建 虚幻引擎.


我的容器已运行,但之后几分钟内无法连接。

  • 一旦容器启动,游戏引擎初始化就会开始。此过程可能需要几秒到几分钟不等,在此期间服务器不会接受玩家连接。

  • 考虑优化服务器初始化以缩短此时间段。

  • 游戏客户端应以 1 秒间隔重试连接,持续有限的时间(取决于您的初始化时长),之后应返回匹配流程。

  • 考虑添加加载场景,这样服务器可以在客户端同时执行初始化(在 Unreal Engine 的情况下还可进行 travel),同时同步双方的状态。


警告:无法为绑定地址创建套接字

  • 请通过 Fab 资产商店安装 Epic 的 Steam 子系统插件。

  • 当使用从 GitHub 下载的 Edgegap Integration Kit (EGIK) 与 SteamCore Integration Kit (SIK) 源代码版本时,由于 Epic Games 的插件分发策略,Epic 的 Steam 子系统插件未包含在内。


我已连接但屏幕完全黑屏。

  • 请确认您在以下位置设置了正确的 游戏默认地图 位于 编辑 / 项目设置 / 地图与模式.

☁️ 4. 发布到 Edgegap

现在是将你的服务器上线部署的时候了!既然你的镜像可以成功承载玩家,我们就可以将其上传到 Edgegap 并开始在全球任意地点运行。在本指南中,我们将使用 Edgegap 的容器注册表 (镜像存储)。

☑️ 选择一个应用名称 用于在 Edgegap 上标记和分组相似的镜像。

☑️ 选择您希望发布的镜像标签上传镜像。完成此步骤将把您的服务器镜像上传到 Edgegap Registry,并在您的网页浏览器中创建一个新的 应用版本确保在提示时创建您的 端口映射使用默认值.

✅ 您现在可以继续到下一步。

故障排除与常见问题

拒绝:添加 756.6 MiB 的存储资源,更新到当前使用 4.3 GiB 后将超过配置的上限 4.7 GiB , 在引用 "layer-sha256:--------" 上提交失败:对 https://registry.edgegap.com/ 的 PUT 请求返回了意外状态

  • 看起来你的镜像存储空间已在以下位置用尽 容器镜像仓库。请考虑删除未使用的构建产物(如果有的话)或优化服务器构建大小。如果使用自定义 Dockerfile 或 .dockerignore,可能会将一些不需要的文件复制到镜像中。


你已达到应用数量上限 2 , 无法更新 docker 标签/版本:你已达到应用版本数量上限 2

  • 你已达到我们免费套餐的限制,请考虑升级你的账户。或者,你可以通过我们的界面移除现有资源 仪表板.


我的新应用版本未在插件/扩展中列出。

  • 请确保你在最后一步已完成应用版本创建表单。

🚀 5. 部署到云端

这是本指南的最后一步,完成后您将在 Edgegap 云上部署一个服务器,来自世界任何地方的玩家都可以连接到该服务器。

☑️ 选择一个应用程序和版本 从上一步部署。

☑️ 一旦准备就绪,点击 部署到云端,等待达到 部署。完成此步骤将会 新的部署正在启动 在你的 Edgegap 帐户上。

☑️ 验证控制台输出中没有新的错误。同时确保你的 部署 没有显示任何错误,并且你的 部署 未显示 100% 资源利用率(vCPU 或内存),否则新的玩家连接可能会被拒绝,或你的服务器陷入重启循环。请参阅下面的故障排除步骤以解决任何问题。

☑️ 现在我们将进行最终测试并 将您的 Unreal Engine 编辑器连接到您的云部署。获取您的 部署的主机 以替代服务器 IP,并获取部署的 外部端口,在游戏客户端中打开 Unreal 控制台(波浪号 ~)并输入 open {host}:{port} .

您在 Edgegap 云上的部署的外部端口将随机选择,以便潜在的攻击者(黑客)在造成损害之前被延缓并被检测到。

☑️ 一旦您确认能够毫无问题地连接到部署并完成测试, 停止您的部署 以释放您帐户中的容量以供下次构建使用。

🙌 恭喜您在 Edgegap 上完成第一次部署!如果您想了解更多,请继续阅读。

故障排除与常见问题

无法将客户端连接到服务器 - 请求超时。 , 请求超时 , ConnectionFailed ,或 端口验证失败


吗?您的连接可能被防火长城阻断。考虑在舰队中添加位于中国的服务器,或使用 VPN 连接。

  • 我的部署已就绪但之后几分钟内无法连接。

  • 考虑优化服务器初始化以缩短此时间段。

  • 游戏客户端应以 1 秒间隔重试连接,持续有限的时间(取决于您的初始化时长),之后应返回匹配流程。

  • 考虑添加加载场景,这样服务器可以在客户端同时执行初始化(在 Unreal Engine 的情况下还可进行 travel),同时同步双方的状态。


警告:无法为绑定地址创建套接字

  • 请通过 Fab 资产商店安装 Epic 的 Steam 子系统插件。

  • 当使用从 GitHub 下载的 Edgegap Integration Kit (EGIK) 与 SteamCore Integration Kit (SIK) 源代码版本时,由于 Epic Games 的插件分发策略,Epic 的 Steam 子系统插件未包含在内。


我已连接但屏幕完全黑屏。

  • 请确认您在以下位置设置了正确的 游戏默认地图 位于 编辑 / 项目设置 / 地图与模式.

  • 一旦部署处于 Ready 状态,游戏引擎初始化就会开始。此过程可能需要几秒到几分钟不等,在此期间服务器不会接受玩家连接。 验证 已在 DefaultEngine.ini.


中禁用 Unreal Engine 版本兼容性检查


以发现导致部署停止的所有原因。

  • 我的部署在 X 分钟后自动停止。

  • 免费层部署有 60 分钟限制,建议考虑升级您的账户。 您位于中国并使用.

  • 集成第三方日志存储 部署 查看


根据我们的服务器清理策略,所有部署在运行 24 小时后将被终止,用于基础设施维护并防止在部署未正确关闭时产生意外费用。对于长期运行的服务器,考虑使用

  • 如果玩家离开我的部署会发生什么?

  • 默认情况下,服务器不会拒绝玩家连接。玩家身份验证由您的开发者决定,因为可以使用许多不同的方法和玩家身份验证提供商。

  • 游戏客户端可以在本地存储连接信息,以便在客户端意外崩溃时尝试重新连接。 深入解析要允许玩家加入正在进行的游戏,请考虑使用.


会话

  • 我的服务器在变为就绪后显示 100% CPU 利用率。

  • 这可能并非问题,因为游戏引擎在服务器初始化期间通常会执行高 CPU 消耗的操作。如果在部署开始后 2-3 分钟内 CPU 使用率仍未下降,您可能需要优化服务器或增加应用版本资源。

  • 降低 Tick 频率可以通过处理更少的消息来帮助控制 CPU 使用率。

  • 免费层限制为 1.5 vCPU 和 3GB 内存(RAM)。


您可以在创建新应用版本时增加分配的资源。您可以在我们的仪表板中复制应用版本并根据需要调整这些值,无需重新构建服务器或镜像。 我的部署反复重启并显示错误

  • OOM kill

  • 降低 Tick 频率可以通过处理更少的消息来帮助控制 CPU 使用率。

  • 免费层限制为 1.5 vCPU 和 3GB 内存(RAM)。


这是由于超出分配内存造成的。考虑通过对象池、压缩或移除场景中不必要的对象来优化内存使用。

  • 有时我的服务器内存(RAM)使用会短时间飙升到很高,这是问题吗?

  • 只要您保持在分配的应用版本内存额度内,这不是问题。 我的部署反复重启并显示错误 超出分配的应用版本内存额度将导致


(见上文)。

  • 在同一台机器上运行的其他服务器会影响我的服务器性能吗?

不会,我们的平台确保分配的资源不会被其他工作室或共享基础设施上的其他服务器使用。使用 Edgegap,不存在“嘈杂邻居”。

一旦你有了可运行的客户端/服务器设置,确保 保存你的项目副本 (使用像 git 这样的版本控制软件),以便在遇到问题时你始终可以追溯你的步骤。

继续阅读以了解更多与服务器生命周期和可发现性相关的主题。

👉 下一步

停止部署 了解各种方法以 停止部署 端点存储 在比赛结束且玩家离开后。连接您的

以获取您的部署日志,否则日志将被删除!

注入变量

应用版本变量 - 由您可配置的自定义键值对。

// 服务器代码

剖析服务器 部署, 部署要在 Edgegap 上理解并优化服务器性能问题,请探索 部署 等可用

工具。

分析

内存洞察

阅读有关匹配系统的更多内容

以便自动按需部署,正好在玩家上线时。

Epic 的资源分块技术和建议

  • 排除仅用于客户端且服务器运行不需要的资源和插件。 了解.

构建时资源和插件排除

  • 审查您的内容烹制(cooking)策略。 考虑 即时烹制(COTF)

以延迟烹制客户端资源并加快服务器构建速度。

减少超过 60%,并提升客户端性能!

查看 Docker 镜像优化建议 示例 .dockerignore

**/Packaged/* 考虑使用.

  • 多阶段 Docker 构建(链接)

  • 将大型服务器依赖项分离到单独的镜像以在多阶段构建中重用。Docker 会缓存每一层并在未明确指示上传此部分时重用先前版本并跳过上传,从而节省带宽和等待上传完成的时间。 如果您不确定为什么某个 Dockerfile 命令抛出错误,尝试在本地调试。在问题发生之前创建一个新阶段(添加第二个 FROM 命令),使用 --target 指示构建过程在有问题的阶段停止,然后 docker exec -it {container} /bin/bash 进入容器内的交互终端。之后,您可以在基础镜像中使用 shell 命令进一步调查(例如在 ubuntu 上使用 top

)。

自定义服务器镜像

始终确保您使用的是可正常工作的服务器构建。

  • 在假设问题与自定义 Dockerfile 有关之前,请确保您的 Unity 服务器构建可以启动,并且 Unity 中的构建过程没有抛出任何异常或错误。

在上传之前务必先进行本地测试。

  • 在本地测试镜像可以为您节省大量等待上传完成的时间。它也完全免费 ✨ 因为不需要任何 Edgegap 资源。

  • 在本地测试时,请确保正确设置内部端口:

确保掌握基本要点。每个 Dockerfile 都需要一些基本命令:

  • FROM {image} 是您的基础镜像,对于 Unity 项目我们通常使用长期支持的 Linux,但任何基于 Linux 的基础镜像都可以。这些通常是存放在 dockerhub 上的公共镜像。Dockerfile 参考在此处。 Dockerfile 参考在此处.

  • COPY {source} {destination} 将您的 Linux 服务器构建从主机复制到镜像内部,以便您稍后可以启动它。 Dockerfile 参考在此处.

  • USER {user} 应当跟在 useradd(ubuntu)命令 或等效命令之后,最好不要以 root 身份运行所有内容,以更安全为宜。 Dockerfile 参考在此处.

  • CMD {command} 将是最后一行,很可能会调用一个 StartServer.sh 或某种启动脚本,以确保在所有设置完成后服务器正确初始化。 Dockerfile 参考在此处.

  • 切勿使用 VOLUME - 这样您将无法在 Edgegap 上挂载任何本地存储,请改用我们的端点存储功能并使用 S3 存储桶,参见 端点存储,

  • EXPOSE 7777/UDP 不是必需的!这实际上不会使容器外部可用内部服务器端口,它只是对开发者的提示,端口需要被

    • 在本地使用以下命令测试时发布: docker run <image> -p 7777/udp ,

中映射。 将参数的声明延迟到尽可能晚的时刻。由于服务器构建时间较长,可配置性优于可组合性。

  • 将此方法应用于 Dockerfile 命令以更快地构建和上传。

  • 场景:您需要定义诸如部署阶段、版本、游戏模式、地图、每台服务器的玩家数、备份频率或类似参数。

  • 糟糕的解决方案:为每一种参数组合创建单独的镜像。您会把所有时间都花在重建镜像上,而这种方法带来的好处非常有限。

    1. 更好的解决方案——即时替换配置参数:

    2. 部署参数——在部署前提供——匹配选择器作为环境变量传入,或由您自定义的会话管理系统在部署时传入环境变量,

    3. 版本参数——在某个应用版本的所有部署间共享——部署阶段、制品标签、第三方密钥和端点等;然后

单一镜像——包含并在启动时加载所有配置选项。

  • 切勿在 Edgegap 部署上运行数据库。

  • Edgegap 部署并不适合长期运行的进程,且可能在长时间运行后被终止而不另行通知。以这种方式运行的数据库(即使是分布式的)可能会被终止并导致不可逆的数据丢失。如果您需要数据库,请考虑第三方 DBaaS。 托管集群 考虑使用我们的

最后更新于

这有帮助吗?