Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/373.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
Javascript NodeJS+;套接字IO发送的数据太多_Javascript_Node.js_Socket.io - Fatal编程技术网

Javascript NodeJS+;套接字IO发送的数据太多

Javascript NodeJS+;套接字IO发送的数据太多,javascript,node.js,socket.io,Javascript,Node.js,Socket.io,我目前正在开发一款使用NodeJS+SocketIO的游戏,但是发送的数据量有问题。服务器当前发送大约600-800 kbps,这一点都不好 以下是我的课程: Shape Pentagon Square Triangle Entity Player Bullet 每帧(60 fps),我更新每个类,每个类将有一个updatePack,它将被发送到客户端。updatePack非常简单,它只包含对象的id和coords 起初,我以为每个人的游戏都是这样的(

我目前正在开发一款使用NodeJS+SocketIO的游戏,但是发送的数据量有问题。服务器当前发送大约600-800 kbps,这一点都不好

以下是我的课程:

Shape
    Pentagon
    Square
    Triangle
Entity
    Player
    Bullet
每帧(60 fps),我更新每个类,每个类将有一个
updatePack
,它将被发送到客户端。updatePack非常简单,它只包含对象的id和coords


起初,我以为每个人的游戏都是这样的(我真傻)。我查看了几个简单的游戏,如agar.io、sliter.io、diep.io和rainingchain.com,发现它们使用<100kbps,这让我意识到我发送的数据太多了

然后我研究了如何压缩发送的数据。但后来我发现数据在Socket.io中发送时会自动压缩


以下是我发送数据的方式:

for(var i in list_containing_all_of_my_sockets){
    var socket = list_containing_all_of_my_sockets[i];
    data = set_data_function();
    socket.emit('some message', data);
}

如何使其发送更少的数据?有什么我遗漏的吗?

也许最好不要每帧都发送数据,而是只在某些特定事件(如碰撞、死亡、繁殖)时发送。

每当通过网络发送消息时,它不仅包含要发送的实际数据,还包含许多用于路由的附加数据,错误预防和其他东西。 由于您在单个消息中发送所有数据,因此您将为每个消息创建这些附加信息


因此,您应该收集所有需要发送的数据,将其保存到一个对象中,然后在一条消息中发送此数据。

考虑到游戏处理服务器-客户端流量的方式,您的回答是自以为是的。这不是答案:

渲染是一个表示问题。您的服务器是关于游戏状态的唯一真实来源,应该只关心更改和宣传游戏状态。60fps渲染不是服务器的问题,因此服务器不应该每秒为所有移动对象发送60次更新(最好在服务器上渲染整个内容并将其作为视频流发送)

客户端应该知道游戏状态,并知道如何以60fps的速度呈现不断变化的游戏状态。服务器应仅向客户端发送状态更改或更改状态的事件。在后一种情况下,客户机将知道如何应用这些事件来更改状态以及服务器已知的状态


例如,服务器可以只发送每个对象的更新运动矢量(甚至作用力),客户端可以根据当前已知的运动矢量+经过的时间来计算每个对象的坐标。

您可以使用数组而不是对象来缩小一些尺寸(通过省略关键点)。以后使用这些数据会更困难,但是。。。你必须做出妥协

而且,从外观上看,你也可以利用它

至于更新,我使用Node.js和Socket.IO制作了一些游戏。过程如下:

  • 具有socket id
    player1
    的播放器发送数据(比如坐标
    {x:5,y:5}
  • 服务器接收数据并将其保存在包含所有玩家数据的对象中:

    {
        "player1": {x:5, y:5},
        "player2": ...
        ...
    }
    
  • 服务器将该对象发送到
    player1

  • player1
    接收对象,并使用数据可视化其他玩家
  • 基本上,玩家只有在发送自己的数据后才能接收数据。这样,如果他的浏览器崩溃,你就不会用数据轰炸他。否则,如果您在用户浏览器挂起时发送了15个更新,则用户需要更多时间来处理这15个更新。在此期间,您会发送更多更新,因此浏览器需要更多的时间来处理更新。这场雪球酿成了一场灾难

    当玩家仅在发送自己的数据后才收到数据时,请确保:

  • 发送玩家立即获取其他玩家的数据,这意味着他不会等待服务器每秒60次的更新
  • 如果玩家的浏览器崩溃,他将不再发送数据,因此也不再接收数据,因为他无法将数据可视化

  • 看起来很有趣!让我试试,我会给你回复的。