Multiverse Q&A
Multiverse Q&A
1. Allocation 生命周期有哪几个阶段?
Allocation共有6种状态
- created: 对应服务器页面显示的 正在分配服务器 状态, 代表 allocation 创建成功, 正在为你分配服务器.
- allocated: 对应服务器页面显示的 正在运行 状态, 代表分配服务器成功, 服务器正在运行.
- canceled: 对应服务器页面显示的 已取消 状态, 如你创建了 allocation 但还没有到达 allocated 状态, 你可以通过 DeleteAllocation API 取消分配.
- failed: 对应服务器页面显示的 分配失败 状态, 可以查看日志定位失败原因.
- unhealthy: 对应服务器页面显示的 心跳检测失败 状态, GameServer 启动后便会开始心跳检测, 如果遇到 unhealthy 状态, 说明 GameServer 崩溃或是哪里有问题导致无法正常发送心跳检测包.
- deallocated: 对应服务器页面显示的 已回收 状态, 有以下几种情况会触发服务器回收:
- GameServer 主动调用 multiverseSdk.Shutdown() 方法.
- 调用 DeleteAllocation API 删除 allocation (该 API 如果遇到 created 状态的 allocation 则取消分配, 遇到 allocated 状态的 allocation 则销毁分配).
- 游戏服务器超时自动回收 (创建 APP 的时候可以指定一个统一的 allocation 超时回收时长, 创建每个 allocation 的时候也可以给单独指定超时回收时长, 但不能超过创建 APP 时指定的时长).
2. 镜像配置里启动超时时长作用是什么? 何时调用 multiverseSdk.ready() 方法.
Multiverse 会在 GameServer 调用 multiverseSdk.ready() 方法之后认为游戏启动成功并标记服务器状态为 allocated, 在这之后调用 GetAllocation API 可以拿到服务器的 IP 和 Port. 所以 GameSever 需要在成功启动并且完全就绪之后调用 multiverseSdk.ready() 方法.
启动超时时长: 即调用 Allocation 至 Multiverse 收到 multiverseSdk.ready() 的最长时间.
如果 Multiverse 在这个时长内未收到 GameServer 调用 multiverseSdk.ready() 的信号, 就会标记该 Allocation 为 failed 状态.
3. 如何给 Game Server 传递参数?
- 可以在镜像配置里 入口程序启动命令 一栏给 GameServer 传递静态参数, 舰队模式下还可以在 环境变量 一栏给所有 GameServer 配置统一的环境变量.
- 在创建 allocation 时, 也可以配置 环境变量 给每个 GameServer 配置单独的环境变量, 配置成功后, 可在 GameServer 里通过 GetAllocationEnvsAsync 方法拿到环境变量.
- 按需模式不会预先启动 GameServer , 创建一个 allocation 会启动一个 GameServer, 可以根据获取到的环境变量选择启动方式.
- 舰队模式会预先启动好 GameServer, 如舰队模式需要根据环境变量选择不同的启动方式, 可通过 WatchGameServer 方法, 监听 GameServer status 或是 labels, 成功拿到数据后, 再去控制不同的启动方式.
4. Func 的服务器和 Multiverse 的服务器有什么区别?我在我的游戏开发过程中应该如何选择这几款产品?
Multiverse 主要提供针对"开启游戏对局"或"创建对战房间"等场景的战斗服;而 Func 则为游戏提供一个持续存在的逻辑服务器,供玩家连接和游玩。在实际使用过程中,Multiverse 的服务器生命周期会随着一场游戏对局的推进和结算而变更,每开启一场游戏对局就会启用一个 Multiverse 服务器用于同步对局中的玩家的状态等相关对局信息;而 Func 的服务器生命周期通常是和一款完整游戏 的运营周期密切相关,随着游戏玩家增多,您可以手动启用新的游戏服务器,或者配置 弹性伸缩 功能来动态调整投入使用的游戏服务器数量和配置。
5. 为什么 Multiverse 端口无法连接?
配置中的服务器端口为内部监听端口,连接时请使用Multiverse映射后的端口。如下图,配置时填的服务器监听端口为9998,但是连接时请使用映射后的端口7417进行连接:
6. 小程序/小游戏真机无法正常使用?
问题描述:服务在Unity编辑器,小程序/小游戏开发工具中均可正常使用,但真机环境下小程序无法正常访问服务器。
解决方案:请添加域名 https://multiverse.scaling.unity.cn 至平台白名单。
7. 为什么游戏场景更推荐使用 KCP 协议?
鉴于 UDP(KCP 协议的基础)相比 TCP(WebSocket 协议的基础)能够提供更快的传输速度,更适合用于游戏场景。基于此,我们更推荐大家采用 KCP 协议以实现更好的游戏性能。
8. 使用 KCP 协议时,需要安装的资源包有哪些?
在使用 KCP 协议时,除了按照教程中的步骤安装 Kcp Transport for Netcode for GameObjects 资源包外,还需安装 Kcp 协议包。
9. 使用 KCP 协议在 iOS 微信小游戏平台连接失败?
当在 iOS 微信小游戏平台使用 KCP 协议时出现连接失败问题,请确认是否已在微信小程序管理页面开启高性能模式。由于在 iOS 设备上运行微信小游戏需要开启「微信高性能模式」,开启该模式的具体步骤为:登录微信小程序页面,依次选择「功能 → 游戏能力地图 → 研发能力 → 生产提效包 → 高性能模式」,最后点击「开通」按钮。
10. Fleet服务器配置参数解释
Fleet服务器分为2种
- 运行服务器:已经在跑游戏程序的服务器,简单的可以理解为已经有玩家在里面了。
- 预留的服务器:程序已经预装,但是属于程序待命的状态,有玩家需要玩的时候可以秒级分配的服务器。
这2种服务器都会计费,原因是机器已经分配出来,专为这个游戏预留了,保证分配的速度和创建服务器的稳定性。
配置参数解释:
最少服务数(200):我的预留服务器 + 已经在运行的服务器 不能小于200个。
最多服务数(9999):最大值限制,这个游戏的同时运行的服务器最多能开到9999个。
弹性预留额度(百分比:20%):(运行的服务器 + 预留服务器)* 预留额度百分比 = 实际需要预留服务器。可以参考以下2种情况来看:
- 当前已经在运行的服务器是300台,根据计算公式 (300 + 预留的额度) * 0.2 = 预留的额度,得出预留额度为75台。实际服务器数量就是:300台已运行 + 75台预留服务器。
- 当前已经在运行的服务器是100台,原本根据计算公式 (100 + 预留的额度) * 0.2 = 预留的额度,得出预留额度为25台。但是由于设置了最小服务数为200台 >(100台已运行 + 25台需要预留服务器)。由于最小服务数的限制,目前还有100台预留的服务器,且大于需求的25台,不需要额外预留。那么实际的服务器数量就是:100台已运行 + 100台预留服务器(最小服务数200 - 100台已运行)。
弹性预留额度(固定值:20):实际需要预留服务器。具体的可以参考以下2种情况来看:
- 当前已经在运行的服务器是300台。实际服务器数量就是:300台已运行 + 20台预留服务器。
- 当前已经在运行的服务器是100台,那么本来需要预留的额度就是 100 + 20 = 120 台。但是由于设置了最小服务数为200台 >(100台已运行 + 20台需要预留服务器)。由于最小服务数的限制,目前还有100台预留的服务器,且大于需求的20台,不需要额外预留。那么实际的服务器数量就是:100台已运行 + 100台预留服务器(最小服务数200- 100台已运行)。
11. 更新Fleet预留服务器数量(启动配置的最少服务数和弹性预留额度)注意事项
- Fleet预留服务器数量支持自助调大和调小,点击更新按钮后,后台会开始为你调节预留服务器数量, 这是一个缓慢的过程,网页上会显示正在更新中的加载ui,当该ui不再显示时,代表更新完成
- Fleet预留服务器数量更新过程中,禁止重复更新,禁止应用新的镜像配置, 禁止删除处于更新状态的启动配置
- 启动配置的最少服务数和弹性预留额度初始值为 1 和 20%,在当前无服务器运行中的情况下,禁止更改启动配置。且在释放服务器资源后,最少服务数和弹性预留额度会自动恢复到初始值