我目前正在使用NodeJS + SocketIO开发游戏,但是发送的数据量有问题。服务器当前发送大约600-800 kbps,这一点都不好。
以下是我的课程:
$this->form_validation->set_rules('user', 'Usuario', 'required|trim|callback_veryuser['.$this->input->post('user').']');
每一帧(60 fps),我更新每个类,每个类都有一个Shape
Pentagon
Square
Triangle
Entity
Player
Bullet
,将被发送到客户端。 updatePack非常简单,它只包含对象的id和coords。
起初,我认为每个人的游戏都是那样的(愚蠢的我)。我查看了几个简单的游戏,如agar.io,slither.io,diep.io和rainingchain.com,发现他们使用< 100 kbps让我意识到我发送了太多数据。
然后我研究了压缩正在发送的数据。但后来我发现在Socket.io
发送时会自动压缩数据以下是我发送数据的方式:
updatePack
如何让它发送更少的数据?有没有我错过的东西?
答案 0 :(得分:1)
意见回答,考虑 a 方式游戏处理服务器 - 客户端流量。这不是 答案:
渲染是一个演示问题。您的服务器,这是关于游戏状态的唯一真相来源,应该只关心改变和宣传游戏状态。 60fps渲染不是服务器关注的问题,因此服务器不应该每秒为所有移动对象发送60次更新(您最好只是在服务器上渲染整个内容并将其作为视频流发送)。
客户应了解游戏状态,并知道如何以60fps渲染不断变化的游戏状态。服务器应该只发送状态更改或将状态更改为客户端的事件。在后一种情况下,客户端将知道如何应用这些事件来与服务器已知的状态一起更改状态。
例如,服务器可能只是为每个对象发送更新的运动向量(甚至代理力),客户端可以根据当前已知的运动向量+经过的时间来计算每个对象的坐标。 / p>
答案 1 :(得分:0)
也许最好不要每帧发送数据,而是仅在某些特定事件(等碰撞,死亡,产生)上发送数据
答案 2 :(得分:0)
每当通过网络发送消息时,它不仅包含您要发送的实际数据,还包含许多用于路由,错误预防和其他内容的附加数据。 由于您要在单个邮件中发送所有数据,因此您可以为每一封邮件创建这些附加信息。
因此,您应该收集需要发送的所有数据,将其保存到一个对象中,然后将其发送到一个对象中。
答案 3 :(得分:0)
您可以使用数组而不是对象来减少某些大小(通过省略键)。稍后使用数据会更难,但是......你必须妥协。
另外,从它的外观来看,Socket.IO can compress data也是如此,所以你可以利用它。
至于更新,我使用Node.js和Socket.IO制作了一些游戏。该过程如下:
player1
的播放器发送他的数据(让他们说坐标{x:5, y:5}
)服务器接收数据并将其保存在包含所有玩家的对象中。数据:
{
"player1": {x:5, y:5},
"player2": ...
...
}
服务器将该对象发送到player1
。
player1
接收该对象并使用该数据可视化其他玩家。基本上,玩家只有在发送了自己的后才会收到数据。这样,如果他的浏览器崩溃,你就不会用数据轰炸他。否则,如果您在用户的浏览器被挂起时发送了15个更新,则需要更多时间来处理这15个更新。在 时间内,您发送更多更新,因此浏览器需要 甚至更多 时间来处理它们。这场雪灾变成了灾难。
当玩家在发送自己的数据后才收到数据时,请确保: