Javascript NodeJS+;套接字IO发送的数据太多
我目前正在开发一款使用NodeJS+SocketIO的游戏,但是发送的数据量有问题。服务器当前发送大约600-800 kbps,这一点都不好 以下是我的课程: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 起初,我以为每个人的游戏都是这样的(
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制作了一些游戏。过程如下:
player1
的播放器发送数据(比如坐标{x:5,y:5}
){
"player1": {x:5, y:5},
"player2": ...
...
}
player1
player1
接收对象,并使用数据可视化其他玩家看起来很有趣!让我试试,我会给你回复的。