2016-07-29 124 views
1

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

这里是我的课:

Shape 
    Pentagon 
    Square 
    Triangle 
Entity 
    Player 
    Bullet 

每一帧(60 fps)的,我更新每个班级,每个班级都会有一个updatePack将被发送到客户端。 updatePack非常简单,只包含对象的id和coords。


起初,我认为每个人的游戏都是这样的(愚蠢的我)。我研究了几个简单的游戏,比如agar.io,slither.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); 
} 

我怎样才能使它发送较少的数据?有什么我错过了吗?

回答

0

也许它最好不要发送数据的每一帧,而是把它仅适用于某些特定事件(碰撞等,死亡,鱼卵)

0

只要消息发送在网络上它不仅包含实际你想发送的数据,还有很多额外的路由数据,错误预防和其他内容。 由于您将单个邮件中的所有数据都发送出去,因此您将为每个邮件创建这些附加信息。

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

+0

看起来有趣!让我试试,我会回到你身边。 – Meinkraft

1

意见回答,考虑a方式游戏处理服务器 - 客户端流量。这不是回答:

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

客户端应该了解游戏状态并知道如何以60fps渲染变化的游戏状态。服务器只应发送状态更改或将状态更改为客户端的事件。在后一种情况下,客户端会知道如何应用这些事件来改变状态,并与服务器已知的状态一致。例如,服务器可能只是为每个对象发送更新的运动矢量(或者甚至是作用力),并且客户端可以基于它们当前已知的运动矢量+经过的时间来计算每个对象的坐标。

0

您可以使用数组而不是对象来减少某些大小(通过省略键)。这将很难使用后来的数据,但是......你必须做出妥协。

另外,从外观上看,也是Socket.IO can compress data,所以你可以利用它。

至于更新,我用Node.js和Socket.IO做了几个游戏。过程如下:

  1. 播放器与插座ID player1送他的数据(假设坐标{x:5, y:5}
  2. 服务器接收数据并包含所有玩家的数据对象进行保存:

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

  4. player1接收该对象并使用该数据来可视化其他玩家。

基本上,玩家只有在他发送了自己的后才会收到数据。这样,如果他的浏览器崩溃了,你不会用数据轰炸他。否则,如果您在用户浏览器挂起时发送了15个更新,他需要更多时间来处理这15个更新。在那个时候,你发送更多更新,所以浏览器需要更多时间来处理它们。这雪球变成了一场灾难。

当一个玩家只能发送自己的后接收数据,可以确保:

  1. 发送玩家得到其他玩家的数据立即,这意味着他不等待服务器的60倍每秒更新。
  2. 如果玩家的浏览器崩溃,他不再发送数据,因此不再接收数据,因为无论如何他都无法看到它。