我正在尝试使用他们的新 MLAPI(中级网络 API)制作 Unity 游戏。我完全按照 this tutorial 进行操作,没有进行任何更改,并且游戏在我的本地 (Linux) PC 上运行良好。
我更改了连接 IP 并将构建文件复制到我租用的云服务器 (DigitalOcean Ubuntu 20.04),并使用了标志 -mlapi server
和 -batchmode -nographics
选项,但我仍然怀疑它正在尝试在 CPU 上模拟图形。
100% CPU 问题似乎是 documented,建议的解决方案包括 Application.targetFrameRate = 30;
行。我尝试执行以下操作(如果未禁用 vSync,则忽略 targetFrameRate
):
switch (mlapiValue)
{
case "server":
netManager.StartServer();
// https://docs-multiplayer.unity3d.com/docs/troubleshooting/troubleshooting
QualitySettings.vSyncCount = 0;
Application.targetFrameRate = 1;
break;
case "host":
netManager.StartHost();
break;
case "client":
netManager.StartClient();
break;
}
然而,当我移动客户端时,我仍然获得 100% 的 CPU(当然,每个动作在服务器上立即执行的额外奖励(!?)但在每个客户端上执行 1 秒后)。
这里到底发生了什么?网上有人建议这可能与套接字轮询有关,但是当我启动 2 个实例时,其中一个实例被杀死(CPU 耗尽)。请注意,单个服务器似乎仍然反应灵敏。
答案 0 :(得分:0)
这个问题似乎只发生在只有 1 个核心的 Linux 机器上。我尝试在单核上将 fps 降低到 1,这确实将 CPU 降低到了 5% 以下,但前提是我启动单个服务器(例如在端口 7778 上)。一旦我在端口 7779 上启动第二个服务器,我们就会回到 100% CPU。总结:
设置 | 结果 |
---|---|
1 个核心,60 fps,1 个实例 | 100% CPU(坏) |
1 个核心,1 fps,1 个实例 | <5% CPU (OK) |
1 个核心,1 fps,2 个实例 | 100% CPU(坏) |
2 个核心,60 fps,10+ 个实例 | <10% CPU (OK) |
所以我的建议是租一个有 2 个以上 vCPU 的云实例。