4

我正在使用 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;
}
}

这样做,客户端/服务器会因过多的消息而过载,并崩溃。我看到的唯一其他选择是我只会每隔几毫秒发送一次玩家的位置。但是,客户端大部分时间都不会知道玩家的最新位置,并且动作会很跳跃

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

4

2 回答 2

3

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

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

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

于 2013-03-21T22:48:38.447 回答
1

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

于 2013-03-21T22:47:13.823 回答