Unity MLAPI 服务器以 100% CPU 运行

时间:2021-05-13 18:05:59

标签: c# unity3d

我正在尝试使用他们的新 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 耗尽)。请注意,单个服务器似乎仍然反应灵敏。

1 个答案:

答案 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 的云实例。