我正在尝试编写一个小型在线平铺游戏。我已经与套接字建立了游戏 - 服务器连接,因此我可以轻松地将Strings从客户端发送到服务器,反之亦然。
我不明白,我应该以什么形式存储数据以便能够有效地传输数据?我应该使用数据对象,序列化并通过它发送?我应该将数据存储在一个长字符串中吗?或者还有另一种方式吗?
如果重要的是我将发送什么样的数据,它将是关于其他玩家,地图对象等的信息。
我现在已经浏览了几天,但仍然没有结果(可能是因为我不确定如何调用此问题)。
谢谢!
答案 0 :(得分:5)
这里最重要的是:这是一个回合制游戏吗?
对于回合制游戏,您可以使用TCP套接字并通过套接字传输完整的游戏状态(或基于之前游戏状态的增量)。它的编码方式并不重要。
对于实时游戏,尝试尽可能频繁地更新状态非常重要。如果数据包丢失并不重要;也许另一个数据包仍在传输中,它会覆盖先前的数据包。这就是你应该使用UDP套接字而不是TCP的原因。
考虑到您正在谈论基于磁贴的游戏,请考虑与您的客户沟通所需的信息。也许只有球员移动,其余的是静止的?
这是一个难以解决的问题。需要考虑很多设计决策,涉及主要游戏模拟循环的设计,作弊,网络架构测试等。有关您遇到的问题的一小部分示例,请参阅https://developer.valvesoftware.com/wiki/Source_Multiplayer_Networking。
我能给你的最简单的解决方案是:
ENTITY NUMBER - NEW POSITION
。 (即两个32位整数)。当您需要一次通信多个更新时,请确保它们包含在同一个TCP数据包中,并且TCP发送缓冲区立即在两端刷新。400ms
及以后的往返(ping)时间的客户交易时将面临的所有时间问题。如果需要,您可以像这样转换数据包:ENTITY NUMBER - NEW POSITION - CURRENT SPEED VECTOR
这将允许客户端估计实体位置,包括滞后延迟。答案 1 :(得分:0)
这取决于你。您可以使用String,序列化或将数据打包到ByteBuffer并通过网络发送。选择最适合您的方式。但我认为ByteBuffer是最有效的。
我推荐使用Netty库,因为它大大简化了套接字处理。