繁体   English   中英

Java中的实时套接字

[英]Real-time sockets in java

我正在尝试使用套接字使用Java后端为Android编写多人游戏,但我不知道该怎么做。

例如,我要玩家。 第一位玩家按下“ UP”按钮,他的头像向上移动。 我该如何告诉其他所有玩家?

我可以发送消息,该用户的ID已更改为新的X和Y,但是我需要在移动时每毫秒进行一次操作。 那正确吗?

或者,我可以发送带有某个ID的用户按下UP按钮的消息,然后在该新消息之后用户释放UP按钮。 利用这两个事件之间的时间差和移动速度,我可以计算出用户的新坐标,但是在这种情况下,等待时间会出现问题(时间差的计算不够准确),我该怎么做?

您可以通过多种方式来完成此操作,所有这些都将具有您已经发现的缺点。 我猜没有做到这一点的“最佳”方法。

游戏的常见方式是拥有“游戏服务器”。 服务器接收来自所有客户端的输入,并确定结果状态。

例如,客户可以只传输按键,服务器告诉他们按键的位置以及需要绘制的其他客户端的位置。 客户端在本地执行相同的数学运算,并在等待服务器确认时显示此状态。 但这只是一个预测。

落后时,您会发现自己在很多游戏中都在位置之间跳跃,因为实际服务器计算出的位置与您的预测不同步。

服务器端状态决定的另一个优点是客户端不能轻易地欺骗。 防止每一次作弊都不是万无一失的方法。 例如,瞄准机器人只需通过移动鼠标来模拟完全瞄准的用户,这基本上是无法检测到的。 另一方面,只需不告诉客户当前不可见的东西,就可以防止地图黑客/墙壁黑客(任何可以看到看不到的东西的地方)。 只有服务器需要知道完整状态。

服务器方法也可以在没有专用游戏服务器的情况下使用。 而是,其中一个客户端将扮演服务器的角色,并决定游戏状态。 如果原始主机退出,则在某些游戏中,这种责任甚至可以在客户端之间切换。 但是,如果发生这种情况,进行平稳的切换将非常棘手。

如果没有服务器,并且所有客户端都负有同等的责任,则您必须考虑定义哪个客户端负责验证哪个操作的架构。 例如,在射击游戏中,A朝某个方向射击,并认为B仍在那儿,但B已经移动了一点,现在A认为“ B被击中”而B认为“未击中”->要么是一次射击,要么是一个被击中的人应该决定会发生什么。

具有多个决策方的架构可能不适用于每个游戏,这是一项非常复杂的任务。 不仅用于游戏,而且一般用于分布式计算

Java和Sockets只是这里的工具。 实际的问题是,您应该花笔和纸来思考适用于您的方案的模式。

关于每隔一毫秒的坐标:您还可以发送诸如“我将在时间Z到达X,Y点”之类的消息,而其他客户端将对该玩家的路径进行插值,因此您不必传输每个位置。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM