Java MMO游戏数据传输

时间:2012-02-21 08:43:12

标签: java data-transfer

我正在尝试编写一个小型在线平铺游戏。我已经与套接字建立了游戏 - 服务器连接,因此我可以轻松地将Strings从客户端发送到服务器,反之亦然。

我不明白,我应该以什么形式存储数据以便能够有效地传输数据?我应该使用数据对象,序列化并通过它发送?我应该将数据存储在一个长字符串中吗?或者还有另一种方式吗?

如果重要的是我将发送什么样的数据,它将是关于其他玩家,地图对象等的信息。

我现在已经浏览了几天,但仍然没有结果(可能是因为我不确定如何调用此问题)。

谢谢!

2 个答案:

答案 0 :(得分:5)

这里最重要的是:这是一个回合制游戏吗?

对于回合制游戏,您可以使用TCP套接字并通过套接字传输完整的游戏状态(或基于之前游戏状态的增量)。它的编码方式并不重要。

对于实时游戏,尝试尽可能频繁地更新状态非常重要。如果数据包丢失并不重要;也许另一个数据包仍在传输中,它会覆盖先前的数据包。这就是你应该使用UDP套接字而不是TCP的原因。

考虑到您正在谈论基于磁贴的游戏,请考虑与您的客户沟通所需的信息。也许只有球员移动,其余的是静止的?

这是一个难以解决的问题。需要考虑很多设计决策,涉及主要游戏模拟循环的设计,作弊,网络架构测试等。有关您遇到的问题的一小部分示例,请参阅https://developer.valvesoftware.com/wiki/Source_Multiplayer_Networking

我能给你的最简单的解决方案是:

  • 使用TCP套接字,这样您就不必处理数据包丢失。
  • 当服务器上的游戏状态发生变化时,将状态传播到所有客户端。在不占用大量空间的事情上这样做。一个例子是如下传递小数据包ENTITY NUMBER - NEW POSITION。 (即两个32位整数)。当您需要一次通信多个更新时,请确保它们包含在同一个TCP数据包中,并且TCP发送缓冲区立即在两端刷新。
  • 忘记在与400ms及以后的往返(ping)时间的客户交易时将面临的所有时间问题。如果需要,您可以像这样转换数据包:ENTITY NUMBER - NEW POSITION - CURRENT SPEED VECTOR这将允许客户端估计实体位置,包括滞后延迟。

答案 1 :(得分:0)

这取决于你。您可以使用String,序列化或将数据打包到ByteBuffer并通过网络发送。选择最适合您的方式。但我认为ByteBuffer是最有效的。

我推荐使用Netty库,因为它大大简化了套接字处理。