Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Unity3D Socket.IO基本移动延迟_Node.js_Sockets_Unity3d_Networking_Server - Fatal编程技术网

Node.js Unity3D Socket.IO基本移动延迟

Node.js Unity3D Socket.IO基本移动延迟,node.js,sockets,unity3d,networking,server,Node.js,Sockets,Unity3d,Networking,Server,我正在尝试使用Node.JS和Socket.IO创建一个服务器。我想做一个网络游戏,只有简单的运动事件。我写了一些代码,但效果不太好。我有大量的延迟。你可以在下面查看视频。顺便说一下,我在我的DigitalOcean服务器上甚至在我的本地主机上测试它。我的问题有什么诀窍?我真的很想学习网络编程,但我总是被卡住 我将在下面解释我所有的工作。但如果你想查看详细信息代码。您可以访问GitHub项目链接 在客户端,我使用Unity3D。如果用户键按任何箭头键,如upArrow、rightArrow,

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

我将在下面解释我所有的工作。但如果你想查看详细信息代码。您可以访问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);
  });

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

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

其次,以事件驱动的方式考虑node.js。也就是说,只有当玩家在他们附近做出动作时,才向其他玩家发送更新

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

第四,抛弃插座io。套接字io在WebSocket方面的速度是出了名的慢。如果您想使用WebSocket,那么我建议只使用节点库WS。WS-library效率高且速度快。或者,如果您想要一个事件驱动库,比如socketio,但基于WS-library。然后,您可以尝试我使用的自定义库,该库已在多个在线游戏中测试过:。我仍在积极维护它,并将在几周内向c#client发布更新。c#客户端的更新修复了我最近在一个新项目中使用它时发现的一些问题

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

有关联网和预测的更多信息,请参阅:

他还用一些代码示例介绍了所有概念


另请参见:

如果您不介意,请您为github上的项目做些贡献好吗?这样我就可以轻松地检查和学习了。实际上,我可以想象你试图用插值来解释什么。但我不知道如何实现它。