有效地通过网络发送玩家移动

时间:2013-03-21 22:45:11

标签: java networking

我正在使用Slick2D制作Java游戏,并使用Kryonet进行多人游戏。当玩家按下W,A,S或D时,他们会移动,并且PlayerMovePacket对象通过网络(通过UDP)发送到服务器。然后服务器将其发送给其他客户端,其他客户端根据数据包内的信息设置该玩家位置的本地副本。

以下是PlayerMovePacket的代码:

public class PlayerMovePacket {

public Vector2f pos;
public int clientID;

public PlayerMovePacket() {
    pos = new Vector2f(0, 0);
    clientID = -1;
}

public PlayerMovePacket(Vector2f v, int id) {
    pos = v;
    clientID = id;
}
}

这样做,客户端/服务器从太多消息中过载,并崩溃。我看到的唯一其他选择是我每隔几毫秒才会发送玩家的位置。但是,客户大多数时间都不会拥有玩家的最新位置,而且移动会很激动

关于如何阻止服务器过载的任何想法?

2 个答案:

答案 0 :(得分:3)

添加一个阈值,为每一个小动作发送移动数据真的很重要吗?

另一种方法是按照建议每隔几毫秒聚合一次。如果玩家移动了3次(或3个动作),您可以将该移动聚合到一个数据包中并节省一些网络I / O.这实际上取决于游戏以及你的一致性保证。在大多数情况下,每25-50毫秒发送一次数据是可以接受的,因为无论如何你都无法更快地察觉到变化。

@jussi还提到,您可以尝试预测客户端的移动,并且每次收到新的玩家位置数据包时都会进行补偿,这也是可以接受的并且使用相当广泛。我会谨慎地试图让它变得非常复杂,因为它可以使游戏更加跳跃或延迟,但简单的直线轨迹将工作得很好。您可以在许多游戏中看到这样的示例,在这些游戏中,您会看到有时会断开连接的人或在游戏中遇到对象,直到服务器识别出他们实际上已断开连接并且这些事情是可接受的,因为您需要足够高的阈值来延迟峰值不会导致客户端上的服务器完全断开连接。

答案 1 :(得分:1)

我想你可以每隔几毫秒发送一次这些位置并做一些客户端预测,以减少它的跳跃。