Java MMO游戏数据传输

标签 java data-transfer

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

我不明白的是,我应该以什么形式存储数据才能有效地传输数据?我应该使用数据对象,序列化并发送它吗?我应该将数据存储在一个长字符串中吗?还是有别的办法?

如果我要发送的数据类型很重要,那就是有关其他玩家、 map 对象等的信息。

我已经浏览了几天了,仍然没有结果(可能是因为我不确定这个问题怎么称呼)。

谢谢!

最佳答案

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

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

对于实时游戏,尝试尽可能频繁地更新状态很重要。数据包是否丢失并不重要;也许另一个数据包仍在传输中,它会覆盖前一个数据包。这就是为什么您应该使用 UDP 套接字而不是 TCP。

考虑到您在谈论基于图 block 的游戏,请考虑您需要向客户传达哪些信息。也许只有玩家在移动,而其余的都是静止的?

这是一个难题,不允许单一的结论性答案。有很多设计决策需要考虑,涉及主要游戏模拟循环的设计、作弊、网络架构测试等。参见 https://developer.valvesoftware.com/wiki/Source_Multiplayer_Networking作为您面临的问题的一个小例子。

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

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

关于Java MMO游戏数据传输,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9374464/

相关文章:

Java:AbsoluteLayout 中的额外空间

java - JSF - 清除 session 范围内托管 bean 中的值

android - 如何连接 iOS 和 Android 设备并在它们之间发送小数据?

sql-server - 在不同数据库模式之间同步数据的最佳技术?

sql-server - 将 SQL Server 2000 数据库导出为 XML 的最简单方法是什么?

java - 扩展 Log4JLogger 并在运行时调用子类

java - 使用 Byte Buddy 拦截默认构造函数

Java 文件列表 : NPE while using for loop

php - PHP跨脚本读写全局变量

ios - 后台应用程序可以通过耳机插孔传输信息吗?