【问题标题】:Unity3D Socket.IO Basic Movement LatencyUnity3D Socket.IO 基本运动延迟
【发布时间】:2017-12-05 07:35:33
【问题描述】:

我正在尝试使用 Node.JS 和 Socket.IO 制作服务器。我想做一个只有简单运动事件的在线游戏。我写了一些代码,但效果不是很好。我有大量的延迟。您可以查看下面的视频。顺便说一句,我在我的 DigitalOcean 服务器甚至我的 LocalHost 上对其进行了测试。我的问题有什么诀窍?我真的很想学习网络编程,但我总是卡住。

Latency GAMEPLAY YouTube Link -- Especially check 13th seconds

Project GitHub link

我将在下面解释我的所有作品。但是,如果您想查看详细信息代码。您可以访问 GitHub 项目链接。

在客户端,我使用了 Unity3D。如果用户键按下任何箭头键,例如 upArrow、rightArrow,我会将这些信息发送到服务器。通过这样做,服务器知道我想去哪个方向。

if (Input.GetKey(KeyCode.UpArrow))
    {
        Movement = Vector3.up;

        JSONObject data = new JSONObject();
        data.AddField("x", Movement.x);
        data.AddField("y", Movement.y);
        socket.Emit("move", data);
    }
// if Input.GetKey(KeyCode.RightArrow)
// if Input.GetKey(KeyCode.RightArrow) .. etc

在服务器端,我只使用了 Node JS 和 Socket.IO。我创建了一个间隔函数,它只将所有玩家发送给客户端。此间隔函数每 1 秒触发 60 次。您可以在下面看到代码。

setInterval(function() {
  io.emit('state', players);
}, 1000 / 60);

顺便说一句,当服务器接收到任何移动事件时,它会这样做:

socket.on('move', function(data) {
  var player =players[socket.id] ||{};

  player.x =player.x+(data.x*0.1);
  player.y =player.y+(data.y*0.1);
  });

【问题讨论】:

    标签: node.js sockets unity3d networking server


    【解决方案1】:

    您还需要在本地移动。因此,当在客户端发出“移动”命令时,也开始在客户端移动播放器。如果您从服务器收到新信息,请将它们合并。关键字是插值。

    【讨论】:

    • 如果你不介意,你能在github上为项目做一些贡献吗?比我可以轻松检查和学习。实际上,我可以想象你试图用插值来解释什么。但是不知道怎么实现。
    【解决方案2】:

    首先,您不需要间隔,除非您在节点中的服务器上进行实时物理模拟。

    其次,以事件驱动的方式更多地考虑 node.js。 IE。仅当玩家在他们附近进行操作时才向其他玩家发送更新。

    第三次使用客户端预测。 IE。继续在客户端移动播放器,即使服务器尚未收到它。然后根据服务器说有效的最后一个位置进行插值。如果您从服务器发送时间戳,一个简单的线性插值就可以正常工作。

    第四,ditch socket io。当涉及到 websocket 时,Socket io 是出了名的慢。如果你想使用 websockets,那么我建议只使用节点库 WS。 WS 库高效且快速。或者,如果您想要一个事件驱动的库,例如 socket io,但基于 WS 库。然后,您可以尝试我使用的自定义库,该库已在多个在线游戏中进行了测试:https://github.com/Metric/data.io。我仍在积极维护它,并将在几周内向 c# 客户端推出更新。 c# 客户端的更新修复了我最近在新项目中使用它时发现的一些问题。

    但是,tcp 会比 websockets 更有效。与原始 tcp 或 udp 连接相比,Websocket 的开销增加。是的,您仍然会遇到延迟,并且仍然需要客户端预测。

    有关网络和预测的更多信息,请参阅:http://gafferongames.com/networking-for-game-programmers/

    他还通过一些代码示例涵盖了所有概念。

    另见:https://developer.valvesoftware.com/wiki/Source_Multiplayer_Networking

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-11
      • 2018-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-11
      • 1970-01-01
      • 2023-01-31
      相关资源
      最近更新 更多